关于 spring-security
spring-security 是用于配置 Spring Boot 应用身份验证与授权的技能,涵盖 JWT、OAuth2、方法级访问规则及 Web 安全设置等常见模式。
主要功能
- 01配置 SecurityFilterChain 访问规则
- 02实现 UserDetailsService 身份验证
- 03设置 JWT 和 OAuth2 安全
- 04应用方法级授权
- 05配置 CORS、CSRF 和安全标头
适用场景
- 01保护 Spring Boot 应用端点
- 02添加基于 JWT 的无状态身份验证
- 03按角色限制服务方法
- 04设置浏览器与 API 安全策略
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill spring-security安装后在 Claude Code 中输入/spring-security确认已加载。
附带文件LICENSE.txt
详细介绍
适用场景
当用户希望执行以下操作时,请使用此技能:
- 在 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
资源
- 官方参考文档:https://docs.spring.io/spring-security/reference/
- Spring Security 示例:https://github.com/spring-projects/spring-security-samples
关键词
spring security、身份验证、授权、JWT、OAuth2、SecurityFilterChain、UserDetailsService、BCrypt、CORS、CSRF、方法安全、PreAuthorize、角色、权限
评论
支持 Markdown