参考链接:
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 最终项目目录结构

如有问题,欢迎批评指正!
其它具体应用会在后续使用过程中逐渐完善......
在SpringBoot2.7及以上版本中,WebSecurityConfigurerAdapter类已过期。配置过滤器链和WebSecurity需分别通过自定义SecurityFilterChainBean和WebSecurityCustomizerBean实现。文章提供了新建项目、配置示例以及如何设置接口匿名访问和不经过SpringSecurity过滤的步骤。
2万+

被折叠的 条评论
为什么被折叠?



