在Spring Security 5.0之后,Spring团队引入了一种新的安全配置方式,逐步淘汰了传统的WebSecurityConfigurerAdapter
类。这一变化旨在使安全配置更加简单易懂,同时也推动开发者使用更为现代的编程风格,比如使用Java配置而不是XML配置。以下将详细介绍如何在没有WebSecurityConfigurerAdapter
的情况下进行Spring Security配置。
新的Spring Security配置方式
在新的配置方式中,我们直接使用SecurityFilterChain
和UserDetailsService
等组件进行安全配置,而不再依赖于WebSecurityConfigurerAdapter
的继承和重写方法。
1. 引入依赖
首先,我们需要在pom.xml
中添加Spring Security的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 创建安全配置类
接下来,我们可以创建一个安全配置类,使用SecurityFilterChain
进行配置。以下是一个简单的示例,展示了如何配置HTTP请求的安全性,并设置用户的身份验证信息。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/public/**").permitAll() // 允许公共访问
.anyRequest().authenticated() // 其它请求需认证
.and()
.formLogin() // 表单登录
.loginPage("/login")
.permitAll()
.and()
.logout() // 登出功能
.permitAll();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 使用BCrypt加密密码
}
@Bean
public InMemoryUserDetailsManager userDetailsService() throws Exception {
UserDetails user = User.withUsername("user")
.password(passwordEncoder().encode("password"))
.roles("USER") // 授予USER角色
.build();
return new InMemoryUserDetailsManager(user); // 在内存中管理用户
}
}
在这个示例中,我们定义了一个安全过滤链securityFilterChain
,并指定了哪些请求是公共的(不需要认证的),哪些请求需要认证。我们还定义了表单登录的具体配置。
3. 测试安全配置
为了测试这一配置,我们可以启动Spring Boot应用程序,访问配置的登录页面。当用户输入正确的用户名和密码后,就可以看到访问受保护资源的成功返回。
总结
通过不再依赖WebSecurityConfigurerAdapter
,Spring Security的配置变得更加灵活和易于理解。在新的架构中,我们可以使用SecurityFilterChain
和UserDetailsService
等组件进行配置,同时也可以通过Spring的强大功能进行定制化配置。整体而言,这一变化使得安全配置更符合现代开发的趋势,提高了开发效率和代码的可维护性。通过这种新的方式,我们可以轻松实现安全控制,同时保持代码的简洁和清晰。