解决Spring Boot 2.7后WebSecurityConfigurerAdapter的过期问题

参考链接:

1.WebSecurityConfigurerAdapter注释解读

从中可以得知:

  • 如果以后想要配置过滤器链,可以通过自定义SecurityFilterChain Bean来实现;

  • 如果以后想要配置WebSecurity,可以通过WebSecurityCustomizer Bean来实现。

       以前我们自定义类继承WebSecurityConfigurerAdapter来配置我们的Spring Security,主要是配置以下两个东西:

  • configure(HttpSecurity):主要是配置Spring Security中的过滤器链;

  • configure(WebSecurity):主要是配置一些路径放行规则。

2. 新方案代码实操

2.1 新建项目

新建Spring Boot项目,Spring Boot版本选择2.7以上,引入Spring Web和Spring Security依赖:

 

2.2 新建Controller

创建HelloController,提供简单的测试接口:

 package com.study.controller;
 ​
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 ​
 /**
  * @ClassName TestController
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2023/2/20 22:14
  * @Version 1.0
  */
 @RestController
 public class TestController {
     @GetMapping("/test")
     public String test() {
         System.out.println("Hello, Mr.Cui!");
         return "Hi, Mr.Cui!";
     }
 }

2.3 测试

       启动项目,访问:http://localhost:8888/test(注意此处的8888是因为8080端口被占用单独配置的),提示输入用户名(user)、密码(IDEA控制台输出的一串随机字符)才能正常访问:

登录成功页面如下: 

上面是系统默认提供的用户名和密码。

  • 如果想使用自定义的用户,只需要向Spring容器中注入一个UserDetailsService实例即可,此时用户是存在内存中的。如果用户是存在数据库中的,需要提供UserDetailsService接口的实现类并注入到Spring容器中。

 @Configuration
 public class SecurityConfig {
     // 注册UserDetailsService的一个实例
     @Bean
     UserDetailsService userDetailsService() {
         InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
         users.createUser(User.withUsername("root").password("{noop}123456").roles("admin").build());
         users.createUser(User.withUsername("cjn").password("{noop}123456").roles("user").build());
         return users;
     }
 }
  • 配置WebSecurity:设置“/test”接口匿名访问

 @Configuration
 public class SecurityConfig {
     // 注册UserDetailsService的一个实例
     @Bean
     UserDetailsService userDetailsService() {
         InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
         users.createUser(User.withUsername("root").password("{noop}123456").roles("admin").build());
         users.createUser(User.withUsername("cjn").password("{noop}123456").roles("user").build());
         return users;
     }
 ​
     /**
      * 配置WebSecurity:注册WebSecurityCustomizer的一个实例
      */
     @Bean
     WebSecurityCustomizer webSecurityCustomizer() {
         return new WebSecurityCustomizer() {
             @Override
             public void customize(WebSecurity web) {
                 web.ignoring().antMatchers("/test");// 放行/test
             }
         };
     }
 }
  • 配置HttpSecurity:设置“/test”接口不经过Spring Security过滤器链

 package com.study.config;
 ​
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.provisioning.InMemoryUserDetailsManager;
 import org.springframework.security.web.SecurityFilterChain;
 ​
 /**
  * @ClassName SecurityConfig
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2023/2/20 22:20
  * @Version 1.0
  */
 @Configuration
 public class SecurityConfig {
     // 注册UserDetailsService的一个实例
     @Bean
     UserDetailsService userDetailsService() {
         InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
         users.createUser(User.withUsername("root").password("{noop}123456").roles("admin").build());
         users.createUser(User.withUsername("cjn").password("{noop}123456").roles("user").build());
         return users;
     }
 ​
     /**
      * 配置WebSecurity:注册WebSecurityCustomizer的一个实例
      * 对应:configure(WebSecurity)
      */
     @Bean
     WebSecurityCustomizer webSecurityCustomizer() {
         return new WebSecurityCustomizer() {
             @Override
             public void customize(WebSecurity web) {
                 web.ignoring().antMatchers("/test");
             }
         };
     }
 ​
     /**
      * 配置过滤器链:注册SecurityFilterChain的一个实例
      *     对应: configure(HttpSecurity) 
      *           对登录页面等进行配置
      */
 //    @Bean // 新式写法
 //    SecurityFilterChain securityFilterChain() {
 //        List<Filter> filters = new ArrayList<>();
 //        return new DefaultSecurityFilterChain(new AntPathRequestMatcher("/**"), filters);
 //    }
     
     @Bean
     // 老式写法
     SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         http.authorizeRequests()
                 .anyRequest().authenticated()
                 .and()
                 .formLogin()
                 .permitAll()
                 .and()
                 .csrf().disable();
         return http.build();
     }
 }
 ​

重启项目后,不需要进行登录就可以进行访问,因为该路径不经过任何过滤器

2.4 最终项目目录结构

如有问题,欢迎批评指正!

其它具体应用会在后续使用过程中逐渐完善......

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值