Spring Security 安全框架:从入门到实战

📅 2026/8/1 8:08:46
Spring Security 安全框架:从入门到实战
1. Spring Security 简介Spring Security 是 Spring 生态中功能强大且应用广泛的安全框架它为基于 Spring 的应用程序提供了全面的身份认证Authentication和授权Authorization解决方案。无论是单体应用还是微服务架构Spring Security 都能帮助开发者轻松应对 Web 安全、方法级安全、领域对象安全等复杂挑战。2. 核心功能与特性身份认证支持多种认证方式如表单登录、HTTP Basic、OAuth 2.0、JWT 等。授权管理提供基于角色Role、权限Authority、表达式SpEL的细粒度访问控制。防护攻击内置 CSRF、CORS、会话固定、点击劫持等常见 Web 攻击防护。易于集成与 Spring Boot、Spring MVC、Spring Data 等 Spring 项目无缝集成。高度可扩展允许开发者自定义认证逻辑、用户详情服务、密码加密器等组件。3. 快速开始一个简单的安全配置以下是一个基于 Spring Boot 的最小化 Spring Security 配置示例它会为所有请求启用 HTTP Basic 认证。import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; Configuration EnableWebSecurity public class BasicSecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth - auth .anyRequest().authenticated() // 所有请求都需要认证 ) .httpBasic(); // 启用 HTTP Basic 认证 return http.build(); } Bean public UserDetailsService userDetailsService() { // 在内存中创建一个测试用户 UserDetails user User.withDefaultPasswordEncoder() .username(user) .password(password) .roles(USER) .build(); return new InMemoryUserDetailsManager(user); } }启动应用后访问任何端点都需要输入用户名user和密码password。4. 核心概念详解4.1 SecurityContext 与 AuthenticationSecurityContext持有当前线程的Authentication对象它代表了当前用户的认证信息包括主体Principal、凭证Credentials和权限Authorities。4.2 UserDetails 与 UserDetailsServiceUserDetails接口封装了用户的核心信息UserDetailsService则负责根据用户名加载用户数据是连接自定义用户存储如数据库的桥梁。4.3 过滤器链Filter ChainSpring Security 的本质是一个过滤器链请求会依次经过多个安全过滤器如UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter每个过滤器负责处理特定的安全任务。5. 实战基于数据库的认证与角色授权实际项目中用户信息通常存储在数据库中。以下示例展示了如何集成 Spring Data JPA 实现自定义的UserDetailsService。import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; Service public class CustomUserDetailsService implements UserDetailsService { private final UserRepository userRepository; public CustomUserDetailsService(UserRepository userRepository) { this.userRepository userRepository; } Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 从数据库查询用户 UserEntity user userRepository.findByUsername(username) .orElseThrow(() - new UsernameNotFoundException(用户不存在: username)); // 将数据库实体转换为 Spring Security 所需的 UserDetails return org.springframework.security.core.userdetails.User.builder() .username(user.getUsername()) .password(user.getEncryptedPassword()) // 假设密码已加密 .roles(user.getRoles().toArray(new String[0])) // 设置角色 .build(); } }配置 HTTP 安全规则实现基于角色的访问控制Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth - auth .requestMatchers(/admin/**).hasRole(ADMIN) // /admin 路径需要 ADMIN 角色 .requestMatchers(/user/**).hasAnyRole(USER, ADMIN) // /user 路径需要 USER 或 ADMIN 角色 .requestMatchers(/public/**).permitAll() // /public 路径允许所有人访问 .anyRequest().authenticated() // 其他所有请求需要登录 ) .formLogin(); // 启用表单登录 return http.build(); }6. 进阶主题与最佳实践密码加密务必使用PasswordEncoder如 BCryptPasswordEncoder对密码进行哈希存储切勿明文保存。JWT 与无状态认证在微服务或前后端分离架构中可使用 JWTJSON Web Token实现无状态、可扩展的认证方案。方法级安全使用PreAuthorize、PostAuthorize等注解在服务层进行更细粒度的权限控制。CSRF 防护在渲染表单时务必包含 CSRF Token对于纯 API 服务可考虑禁用 CSRF。会话管理合理配置会话超时、并发控制以及安全的会话固定保护策略。