题目
Spring Security 基础配置与内存认证
信息
- 类型:问答
- 难度:⭐
考点
安全配置类,内存认证,密码编码器,权限控制
快速回答
在Spring Security中实现基础内存认证需要:
- 添加Spring Security依赖(spring-boot-starter-security)
- 创建配置类继承
WebSecurityConfigurerAdapter(或使用SecurityFilterChain) - 重写
configure(AuthenticationManagerBuilder auth)方法配置内存用户 - 使用
PasswordEncoder加密密码(推荐BCrypt) - 通过
configure(HttpSecurity http)配置访问权限
原理说明
Spring Security的核心是过滤器链(Filter Chain),请求会依次通过认证、授权等过滤器。内存认证(In-Memory Authentication)将用户凭证存储在内存中,适用于简单场景或测试环境。
代码示例
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 配置用户认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password(passwordEncoder().encode("pass123"))
.roles("USER")
.and()
.withUser("admin")
.password(passwordEncoder().encode("admin456"))
.roles("ADMIN");
}
// 配置访问权限
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin(); // 启用默认登录页
}
// 密码编码器(必须配置)
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}最佳实践
- 密码加密:必须使用
PasswordEncoder,推荐BCryptPasswordEncoder - 权限配置顺序:具体路径(如
/admin/**)应放在通用路径(如anyRequest())之前 - 新版本适配:Spring Security 5.7+ 推荐使用组件配置:
@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests(auth -> auth .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ); return http.build(); }
常见错误
- 未配置密码编码器:导致
There is no PasswordEncoder mapped异常 - 明文存储密码:直接使用明文密码(需通过
passwordEncoder().encode()加密) - 权限配置倒置:将
anyRequest().permitAll()放在路径规则之前会覆盖后续规则
扩展知识
- 角色前缀:Spring Security自动为角色添加
ROLE_前缀(配置中的ADMIN实际对应ROLE_ADMIN) - 默认安全特性:自动启用CSRF防护、会话固定保护等
- 下一步学习:数据库认证(
UserDetailsService)、自定义登录页、方法级安全(@PreAuthorize)