学习 Spring Security 的时候发现通过继承 WebSecurityConfigurerAdapter 类来配置 Spring Security 5.7.2 发现 WebSecurityConfigurerAdapter 类被标记了 @Deprecated 说明这个类已经被弃用,在根据官方文档写新写法的过程中发现 UserDetails 类的 withDefaultPasswordEncoder() 方法也被标记了 @Deprecated 查官方文档如下:
所以我准备找一下新的写法应该怎么写,新的写法如下。
旧写法:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//设置密码加密
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
//配置过滤器
@Override
protected void configure(HttpSecurity http) throws Exception {
//开启HttpSecurity的配置
http.authorizeRequests()
//访问/admin/**模式的url必须具备admin的角色
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").access("hasAnyRole('ADMIN','USER')")
.anyRequest().authenticated().and()
//开启表单验证
.formLogin();
}
//用户认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
//配置两个用户
.withUser("root")
//密码:1234
.password("$2a$10$hoUNz8qpmLlemaJIAZMfJORFJYlF6g/T5uqoWAH1BkFHhL2BMcEay").roles("ADMIN")
.and()
.withUser("user")
//密码1234
.password("$2a$10$hoUNz8qpmLlemaJIAZMfJORFJYlF6g/T5uqoWAH1BkFHhL2BMcEay")
.roles("USER");
}
}
测试类:
@RestController
public class TestController {
@GetMapping("/user/user1")
public String user(){
return "user";
}
@GetMapping("/admin/admin1")
public String admin(){
return "admin";
}
}
先登录user用户进行测试:
测试结果如下:
user 用户的资源可以访问,admin 的资源不能访问
登录 admin 用户:
测试结果如下:
可见 user 用户资源可以访问,admin 的资源也可以访问,说明 Spring Security 的配置文件没有问题。
新写法:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
//开启密码加密
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
//配置过滤器
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
//开启HttpSecurity的配置
http.authorizeRequests()
//访问/admin/**模式的url必须具备admin的角色
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").access("hasAnyRole('ADMIN','USER')")
.anyRequest().authenticated().and()
//开启表单验证
.formLogin();
return http.build();
}
//用户认证
@Bean
public UserDetailsService userDetailsService(){
//创建两个用户
UserDetails user =
User.withUsername("root")
//密码1234
.password("$2a$10$hoUNz8qpmLlemaJIAZMfJORFJYlF6g/T5uqoWAH1BkFHhL2BMcEay")
.roles("ADMIN")
.build();
UserDetails user1 =
User.withUsername("user")
//密码1234
.password("$2a$10$hoUNz8qpmLlemaJIAZMfJORFJYlF6g/T5uqoWAH1BkFHhL2BMcEay")
.roles("USER")
.build();
//这个方法接收的是UserDetails... users,所以可以传入多个user
return new InMemoryUserDetailsManager(user,user1);
}
}
测试类:
@RestController
public class TestController {
@GetMapping("/user/user1")
public String user(){
return "user";
}
@GetMapping("/admin/admin1")
public String admin(){
return "admin";
}
}
先登录 user 用户进行测试:
测试结果:
user 用户的资源可以访问,admin 的资源不能访问
登录 admin 用户:
测试结果:
可见 user 用户资源可以访问,admin 的资源也可以访问,说明新的配置类写的是对的。