参考链接:
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 最终项目目录结构
如有问题,欢迎批评指正!
其它具体应用会在后续使用过程中逐渐完善......