5月29日 01:37

Spring Boot 中如何实现安全认证?

Spring Boot 通过 spring-boot-starter-security 集成 Spring Security,核心流程为:请求进入 SecurityFilterChain,依次经过认证过滤器(如 UsernamePasswordAuthenticationFilter 或自定义 JWT Filter),由 AuthenticationManager 委托 UserDetailsService 加载用户并校验凭证,认证成功后将 Authentication 存入 SecurityContextHolder;授权阶段通过 @PreAuthorize 或 URL 规则判断权限。JWT 场景下需自定义 Filter 从 Header 提取 Token 并验证,同时将 SessionCreationPolicy 设为 STATELESS

追问

  • SecurityFilterChain 的执行顺序如何控制? 通过 http.addFilterBefore()/after() 指定过滤器位置,Spring Security 内置过滤器有固定顺序(如 UsernamePasswordAuthenticationFilter 位于 BasicAuthenticationFilter 之前)。
  • UserDetailsService 和 UserDetails 的职责分别是什么? UserDetailsService 负责从数据源加载用户信息,UserDetails 是用户信息的载体接口,包含密码、权限和账户状态。
  • JWT 无状态方案下如何实现 Token 注销? 可维护黑名单(Redis 存储已注销 Token 直至过期)或采用短期 Token + Refresh Token 轮换机制。
  • @PreAuthorize 和 URL 授权规则各自适合什么场景? URL 规则适合粗粒度的路径级控制,@PreAuthorize 适合方法级细粒度控制,支持 SpEL 表达式如 @userSecurity.canAccess(authentication, #id)
  • 为什么密码必须用 BCrypt 而非 MD5? BCrypt 内置盐值且计算成本可调,抗彩虹表和暴力破解;MD5 是快速哈希,易被暴力穷举。

写段代码

java
@Bean SecurityFilterChain chain(HttpSecurity http) throws Exception { http.csrf(c -> c.disable()) .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(a -> a .requestMatchers("/api/auth/**").permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated()) .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
标签:Spring Boot