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(); }