侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Spring Security 基础配置与内存认证

2025-12-13 / 0 评论 / 4 阅读

题目

Spring Security 基础配置与内存认证

信息

  • 类型:问答
  • 难度:⭐

考点

安全配置类,内存认证,密码编码器,权限控制

快速回答

在Spring Security中实现基础内存认证需要:

  1. 添加Spring Security依赖(spring-boot-starter-security)
  2. 创建配置类继承WebSecurityConfigurerAdapter(或使用SecurityFilterChain
  3. 重写configure(AuthenticationManagerBuilder auth)方法配置内存用户
  4. 使用PasswordEncoder加密密码(推荐BCrypt)
  5. 通过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