irpas技术客

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

irpas 6481

参考链接:

进入 SpringBoot2.7,有一个重要的类过期了_慕课手记

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 最终项目目录结构

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

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


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #解决Spring #Boot