用途
该技能用于在 Spring Boot 应用中提供 Spring Security 的配置与实现指导,覆盖认证、授权、OAuth2、JWT 以及安全最佳实践。当用户需要配置认证与授权、设置 SecurityFilterChain、UserDetailsService 和 PasswordEncoder、实现基于 JWT 的无状态认证、集成 OAuth2 客户端或资源服务器、使用方法级安全(@PreAuthorize 和 @Secured),或配置 CORS、CSRF、会话管理和安全响应头时,可使用该技能。
主要能力
- 配置 Spring Boot 应用中的认证与授权
- 设置 SecurityFilterChain、UserDetailsService 和 PasswordEncoder
- 实现基于 JWT 的无状态认证
- 集成 OAuth2 客户端或资源服务器
- 使用方法级安全,包括 @PreAuthorize 和 @Secured
- 配置 CORS、CSRF、会话管理和安全响应头
使用方式
工作流程:
- 添加 Spring Security starter 依赖
- 配置 SecurityFilterChain 以定义基于 URL 的访问规则
- 实现认证:内存、JDBC、LDAP 或自定义 UserDetailsService
- 添加授权:基于角色或基于表达式的访问控制
1. 基础安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
2. 自定义 UserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
return new org.springframework.security.core.userdetails.User(
user.getUsername(), user.getPassword(), user.getAuthorities()
);
}
}
3. JWT 认证过滤器
@Component
public class JwtAuthFilter extends OncePerRequestFilter {
private final JwtService jwtService;
private final UserDetailsService userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String token = extractToken(request);
if (token != null && jwtService.isValid(token)) {
String username = jwtService.extractUsername(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
var authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authToken);
}
chain.doFilter(request, response);
}
}
4. 方法级安全
@EnableMethodSecurity
@Configuration
public class MethodSecurityConfig {}
@Service
public class AdminService {
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { /* ... */ }
@PreAuthorize("#userId == authentication.principal.id")
public UserProfile getProfile(Long userId) { /* ... */ }
}
最佳实践
- 始终使用 BCrypt 或 Argon2 对密码进行编码;切勿存储明文密码
- 在生产环境使用 HTTPS;配置安全响应头(HSTS、X-Content-Type-Options)
- 应用最小权限原则;仔细设计角色和权限
- 保护敏感端点;对基于浏览器的应用使用 CSRF 保护
- 为 API 服务器显式配置 CORS
适用场景
适用于 Spring Boot 应用的安全配置,包括认证与授权设置、JWT 无状态认证、OAuth2 集成、方法级权限控制,以及 CORS、CSRF、会话管理和安全响应头配置。
限制
资料未提供该技能的具体限制说明。
资源
- 官方参考:https://docs.spring.io/spring-security/reference/
- Spring Security 示例:https://github.com/spring-projects/spring-security-samples
关键词
spring security, authentication, authorization, JWT, OAuth2, SecurityFilterChain, UserDetailsService, BCrypt, CORS, CSRF, method security, PreAuthorize, roles, permissions