Spring Boot 2.7 版本中,WebSecurityConfigurerAdapter 类过期了,改用了不同的方式进行安全配置。下面我将详细讲解这个过程。
WebSecurityConfigurerAdapter 类过期说明
在 Spring Boot 2.7 版本中,WebSecurityConfigurerAdapter 类被标记为 @Deprecated ,意味着该类不再建议使用,而是推荐使用其他方式进行安全配置。
之前,我们可以通过继承 WebSecurityConfigurerAdapter 类来进行安全配置。但是在 Spring Boot 2.7 及以上版本中,WebSecurityConfigurerAdapter 类不再被推荐。
相反,Spring Boot 2.7 推荐使用更加优雅的方式来配置安全,即使用方法级别的安全机制和 @EnableWebSecurity 注释。
使用方法级别的安全机制
在 Spring Boot 2.7 及以上版本中,方法级别的安全机制是最佳实践。它提供了更细粒度的安全保护。可以使用 @PreAuthorize、@PostAuthorize 和 @Secured 进行身份验证和访问控制。
@PreAuthorize 示例
@PreAuthorize 注释对应的方法会在方法被调用之前执行,用于身份验证。如果身份验证失败,则无法调用此方法。下面是一个简单的 @PreAuthorize 注释示例:
@Service
public class MyService {
@PreAuthorize("hasRole('ROLE_USER')")
public String secureMethod() {
return "This method is secured with @PreAuthorize annotation";
}
}
上面的示例中,secureMethod() 方法需要 ROLE_USER 角色才能被调用。
@PostAuthorize 示例
@PostAuthorize 注释对应的方法会在方法被调用之后执行,用于授权访问。如果授权失败,则无法访问此方法的返回值。下面是一个简单的 @PostAuthorize 注释示例:
@Service
public class MyService {
@PostAuthorize("returnObject.username == authentication.name")
public MyDTO getMyDto(String name) {
return new MyDTO(name);
}
}
上面的示例中,如果返回的 MyDTO 对象的 username 字段与当前认证用户的名称匹配,则可以访问该方法。
使用 @EnableWebSecurity 注释
在 Spring Boot 2.7 及以上版本中,使用 @EnableWebSecurity 注释来设置基本的 Web 安全服务。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 在此处配置身份验证机制
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// 在此处配置请求安全保护规则
}
}
上面的代码中,使用 @EnableWebSecurity 注释来启用 Web 安全服务。configureGlobal() 方法用于身份验证机制的配置,它需要通过 AuthenticationManagerBuilder 来进行配置。configure() 方法用于配置请求安全保护规则。
示例代码
下面是一个基于 Spring Security 的全局授权配置的样例代码:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/home").permitAll() // 开放的URL,不需要登录
.anyRequest().authenticated() // 任何请求必须登录后才能访问
.and()
.formLogin()
.loginPage("/login") // 设置登录URL
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication() // 内存中的身份验证
.withUser("user").password(encoder().encode("password")).roles("USER");
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(); // 使用 BCrypt 加密
}
}
以上配置会启用 Spring Security,并保护所有请求的访问。所有对 "/" 和 "/home" 的请求都会被允许,任何其他请求都必须登录后才能访问。
在登录页面("/login")中,可以使用使用 "user" 和 "password" 进行身份验证。
通过内存身份验证并且使用 BCryptPasswordEncoder 加密密码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置 - Python技术站