SuperAPI AI 工具集

spring-security

安全与审计

查看项目

更新于 10-15 14:01

技能介绍

用途

该技能用于在 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、会话管理和安全响应头

使用方式

工作流程:

  1. 添加 Spring Security starter 依赖
  2. 配置 SecurityFilterChain 以定义基于 URL 的访问规则
  3. 实现认证:内存、JDBC、LDAP 或自定义 UserDetailsService
  4. 添加授权:基于角色或基于表达式的访问控制

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