首页 > 其他分享 >Spring Secriuty登录失败错误状态999重定向302

Spring Secriuty登录失败错误状态999重定向302

时间:2023-08-09 16:15:35浏览次数:56  
标签:Secriuty 重定向 登录 Spring 302 conf error 页面

原因是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();
    }
}

image

错误

但是在登录时,总是失败

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

image

如果此时修改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语句。评论这些之后,一切正常。

标签:Secriuty,重定向,登录,Spring,302,conf,error,页面
From: https://www.cnblogs.com/wei-ran/p/17617080.html

相关文章

  • 智慧工地源码,基于Vue+Spring Cloud +UniApp框架开发
    源码技术架构:微服务+JavaVue+SpringCloud+UniApp+MySql智慧工地管理平台是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。智慧工地管理平台功能包括:劳务实名制管理系统、监测系统、区域安......
  • nacos的 Spring Security 身份认证绕过漏洞
     检测出了这个漏洞,但是nacos官方还没有升级文档,所以只能自行下载源码对 Spring-security -config的版本进行调整 如图,对原先的需要进行排除然后在引入漏洞以外的版本,因为是自己修改的,不确定升级版本是否会有未知的隐患,所以对版本是进行了降级的操作,需要修改的POM文件有两......
  • springboot设置log4j2无效
     log4j2需要在资源文件中正确的写法:错误的写法:下面写法会无效的会使用springboot本身的日志 ......
  • SpringBoot - Web项目起步
    环境搭建开发规范1开发规范2.1开发规范2.2开发规范2.3开发流程......
  • springboot不使用端口的方式启动
    SpringBoot项目不占用端口启动现在很多互联网公司或者项目,都使用SpringBoot+SpringCloud,以微服务的形式来提供后台服务。而且既然是微服务,所涉及到的项目就会很多,服务器端口资源就会相当紧张。而且,其实有些项目,如定时任务等,是不需要对外提供服务,也就不需要占用服务器端口的。......
  • spring多数据源动态切换的实现原理及读写分离的应用
    简介AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。应用场景多租户支持:对于多租户的应用,根据当前租户来选择其对应的数据源,实现租户级别的隔离和数据存储。分库分表:为了提......
  • 二、SpringBoot配置
    SpringBoot配置文件springBoot配置一般有application.properties、application.yml、application.yaml优先级:properties>yml>yamlYAML:基本语法大小写敏感数据值前必须有空格作为分隔符使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格(各个系统Tab键生成的缩进对......
  • 三、SpringBoot整合Mybatis
    创建项目实现查询所有功能创建数据库连接数据库在resources文件夹中创建application.yml写入数据库连接参数注意文件结构编写实体类编写DAO层接口编写Service接口及实现类编写Controller层......
  • 四、SpringBoot实现增删改查
    一、新建项目二、代码编写项目结构先在resource文件夹中创建application.yml编写数据库连接配置spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://106.15.105.2:3306/oms?serverTimezone=GMT%2B8&characterEncoding=utf8&us......
  • springboot~mybatis中使用selectKey获取自增主键
    在mybatis中,我们在insert操作之后,可以获取到自增主键的值,这个需要我们用到这个方法,在使用时有一个坑需要注意,一会儿会说到。假设我们有数据表id_offset,然后id是自增主键我们在插入数据后,希望得到这个新插入的主键的值我们不希望通过两条语句实现,因为这样在并发时会有问题数......