原因是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. 2023-03-22:给定一个字符串str, 如果删掉连续一段子串,剩下的字符串拼接起来是回文串, 那么该删除叫做有效的删除。 返回有多少种有效删除。 注意 : 不能全删除,删成空串不允许, 字符串长

    2023-03-22:给定一个字符串str, 如果删掉连续一段子串,剩下的字符串拼接起来是回文串, 那么该删除叫做有效的删除. 返回有多少种有效删除. 注意 : 不能全删除,删成空串不允许, 字符串长 ...

  2. 2020-09-02:Sqoop的工作原理?

    福哥答案2020-09-02: [答案来自此链接](https://www.kaops.com/ivquest/104670)下图显示了Sqoop的工作流程: Sqoop导入导入工具将单个表从RDBM ...

  3. 2022-06-12:在N*N的正方形棋盘中,有N*N个棋子,那么每个格子正好可以拥有一个棋子。 但是现在有些棋子聚集到一个格子上了,比如: 2 0 3 0 1 0 3 0 0 如上的二维数组代表,一

    2022-06-12:在NN的正方形棋盘中,有NN个棋子,那么每个格子正好可以拥有一个棋子. 但是现在有些棋子聚集到一个格子上了,比如: 2 0 3 0 1 0 3 0 0 如上的二维数组代表,一共3 ...

  4. 安全测试实践-万家APP越权逻辑漏洞挖掘

    逻辑漏洞会导致业务面临着巨大的经济损失隐患与敏感数据泄露的风险,本文从安全测试的角度,以越权逻辑漏洞为例,介绍逻辑漏洞的挖掘方法和实践过程. 一.什么是越权逻辑漏洞 定义: 指由于系统的权限控制逻辑不 ...

  5. SpringBoot定义优雅全局统一Restful API 响应框架五

    闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展. 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 ...

  6. [TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数

    做什么 法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数. 这个SDK探幽日志主要是对目前SDK开发中遇到的一些问题 ...

  7. 拒绝conda, 用virtualenv构建多版本的python开发环境

    本文章转载自公众号 "生信码农笔记(ID:bio-coder)",已获得原作者授权. 1. 不喜欢用 conda 特别不喜欢 bioconda, miniconda, Anacon ...

  8. FnOnce , FnMut <RUST>

    FnOnce 1 #[lang = "fn_once"] 2 #[must_use = "closures are lazy and do nothing unless ...

  9. 2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1]。 请问

    2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m.n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1 ...

  10. Nmap使用教程(初级篇)

    基本扫描技术 扫描单个网络 nmap 192.168.1.1/www.baidu.com 扫描多个网络/目标 nmap 192.168.1.1 192.168.1.2 #将扫描同个网段内不同的ip地址 ...