原因是login.html登录页面有不能加载的静态资源,找出来去掉就好了,比如 bootstrap.min.css

环境

使用Spring Boot Security 3做一个登录功能,使用了一个教程提供的HTML登录页面,代码如下

Spring Security配置,自定义了登录页,资源都做了放行,能正常加载,使用数据库认证,正常查出

@Configuration
public class SecurityConfiguration { @Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
} @Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/static/**").permitAll();
auth.anyRequest().authenticated();
})
.formLogin(conf -> {
conf.loginPage("/login");
conf.loginProcessingUrl("/doLogin");
conf.defaultSuccessUrl("/success");
conf.permitAll();
})
.logout(conf -> {
conf.logoutUrl("/doLogout");
conf.logoutSuccessUrl("/login");
conf.permitAll();
})
.csrf(AbstractHttpConfigurer::disable) .build();
}
}

数据库认证

@Service
public class SecurityUserService implements UserDetailsService { @Autowired
UserService userService; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println("登录用户:" + username); User user = userService.getPasswordByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户 " + username + " 登录失败,用户名不存在!");
} System.out.println(user); return org.springframework.security.core.userdetails.User
.withUsername(user.getName())
.password(user.getPassword())
.roles(user.getRole())
.build();
}
}

错误

但是在登录时,总是失败

{
"timestamp": "2023-09-20T08:24:33.240+00:00",
"status": 999,
"error": "None"
}

如果此时修改url再次登录,或者直接访问目标页面,是可以成功的

或者取消自定义登录页,直接使用Spring Security提供的默认登录页是可以登录

解决

问题大致意思是页面有不能加载的静态资源,会转发错误页面,而Spring Security认为错误页面没有授权,就出现这个上面的错误页面,所以在login.html页面,很容易找到一个特殊的静态资源,bootstrap.min.css,去掉就好了

参考java - Spring 安全性重定向到状态代码为 999 的页面 - 堆栈溢出 (stackoverflow.com)

在浪费了很多时间之后,我想出了发生了什么。

所以 spring 找不到登录页面上使用的静态资源之一。但是,它不会返回此资源的状态,而是尝试呈现错误页面并将请求转发到 。然后 spring 安全性拒绝此请求,因为用户未获得授权。它将请求保存到会话(用于成功登录后重定向)并将用户重定向到登录页面。404``/error``/error

当然,用户看不到此重定向,因为状态返回在后台完成的请求。但主要问题是保存在会话中的请求。302``/error

然后用户登录成功,弹簧检查会话中的此属性并重定向到页面。默认情况下,spring假设您在静态资源的某个位置有这样的页面。如果您没有此页面,您将看到状态代码为999的奇怪错误。/error

解决方案 1

忽略安全配置中的页面:/error

web.ignoring().antMatchers("/favicon.ico", "/resources/**", "/error");

因此,成功登录后,此请求将不会保存到会话以供用户重定向。您将看到,在登录页面上,对静态资源的请求的状态代码将从 更改为 。302``404

解决方案 2

忽略部分 Spring 引导自动配置:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

这给出了相同的结果,但禁用了配置中的某些 bean,所以要小心。ErrorMvcAutoConfiguration

我有同样的问题。我尝试注释每个样式表链接,以查看导致错误的一个。这是我的自定义css文件。问题是在我的 css 文件中,我有一个不存在的图像的 url,还有另一个错误的@import语句。评论这些之后,一切正常。

Spring Secriuty登录失败错误状态999重定向302的更多相关文章

  1. Spring Security之多次登录失败后账户锁定功能的实现

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一 ...

  2. 为什么Spring Security看不见登录失败或者注销的提示

    有很多人在利用Spring Security进行角色权限设计开发时,一般发现正常登录时没问题,但是注销.或者用户名时,直接就回到登录页面了,在登录页面上看不见任何提示信息,如“用户名/密码有误”或“注 ...

  3. springmvc集成shiro登录失败处理

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...

  4. Spring Security 登录校验 源码解析

    传统情况下,在过滤器中做权限验证,Spring Secuirty也是在Filter中进行权限验证. 创建并注册过滤器 package com.awizdata.edubank.config; impo ...

  5. Shiro+SpringMVC 实现更安全的登录(加密匹配&登录失败超次数锁定帐号)

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/48518003 前言 初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍 ...

  6. spring security 登录、权限管理配置

    登录流程 1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表)  2)用户发出请求  3)过滤器拦截(MySecurityFil ...

  7. 四:Spring Security 登录使用 JSON 格式数据

    Spring Security 登录使用 JSON 格式数据 1.基本登录方案 1.1 创建 Spring Boot 工程 1.2 添加 Security 配置 2.使用JSON登录 江南一点雨-Sp ...

  8. Oracle取消用户连续登录失败次数限制

    当用户连续登录失败次数过多时,Oracle会锁定该用户,“FAILED_LOGIN_ATTEMPTS”用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以按照以下方法操作: ...

  9. 用户 'IIS APPPOOL\DefaultAppPool' 登录失败。

    今天新建了一个ASP.NET(Language=C#)网站,配置好数据库后编写了几行代码测试数据库的是否能正常使用. 当运行程序时,第一个页面都没有打开就出现了错误(因为我首页就访问数据库,填充一些D ...

  10. ASP.NET连接数据库时,提示“用户 'sa' 登录失败原因: 未与信任 SQL Server 连接相关联

    用ASP.NET连接数据库时,提示"用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联.".解决方法:首先检查是不是web.config文件内的用户名密码 ...

随机推荐

  1. 音视频八股文(9)-- flv的h264六层结构和aac六层结构

    flv介绍 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩.封装简单等特点,⾮常适合于互联⽹上使⽤.⽬前主流的视频⽹站基本都⽀持FLV.采⽤FLV ...

  2. 2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    2021-07-14:接雨水.给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 福大大 答案2021-07-14: 左右指针向中间移动.左指针是左边柱 ...

  3. 又一个开源便斩获 7k star 的新模型「GitHub 热点速览」

    Star 并不能代表什么,但是绝对能表示一个项目的受欢迎程度.就像刚开源一周就有 7k+ star 的新模型,输入文本 / 图像就能获得 3D 对象.除了这个新模型,本周还有一款新的 Web 3D 渲 ...

  4. 2020-06-11-ASP.NET Core Blazor 子组件父组件数据同步的问题

    上一篇写数据绑定的文章,写到最后留了一个坑.当子组件绑定父组件的一个字段,并且子组件修改它的时候父组件不能实时进行同步更新UI的问题,最近终于在Blazui作者的指导下搞定了. UserInfo类要实 ...

  5. 数据库优化案例—某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  6. Godot的几个附加脚本和进行继承时比较特别的特性

    注: 这是在Godot4.0中总结出的内容,并且语言是C#. 特别的,下面有的特性和C#关系比较大. 基本特性 在Godot中,为某个节点编写特别的代码时,需要为节点新建脚本,或引用已有脚本. 引用脚 ...

  7. 基于渗透的python

    Python for Pentesters 还记得开始学习编程的C,虽然淡忘,但思想仍在. 子域名枚举 request库 import pyfiglet import requests import ...

  8. IM1281B电能计量模块_C语言例程

    一.前言 毕设采用了艾锐达公司的IM1281B电量计能模块,找了一圈没发现具体的51单片机的例程,现在写个能使用的C语言例程,方便以后的开发者们. 二.事前准备 引脚定义: 引脚 功能说明 V+ 供电 ...

  9. .Net7基础类型的优化和循环克隆优化

    前言 .Net7里面对于基础类型的优化,是必不可少的.因为这些基础类型基本上都会经常用到,本篇除了基础类型的优化介绍之外,还有一个循环克隆的优化特性,也一并看下. 概括 1.基础类型优化 基础类型的优 ...

  10. LeetCode 周赛 350(2023/06/18)01 背包变型题

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP ...