Spring Security 是一个功能强大且高度可定制的 Java 安全框架 ,主要用于为基于 Spring 的应用程序提供 身份认证(Authentication) 和 访问控制(Authorization) 功能。它广泛应用于 Spring Boot 项目中,用于保护 Web 请求、方法调用、REST API 等。
一、核心功能
1. 身份认证(Authentication)
- 用户登录验证(用户名、密码)
- 支持多种认证方式:表单登录、OAuth2、JWT、LDAP、SAML 等
- 登录成功/失败处理逻辑
2. 授权(Authorization)
- URL 级别访问控制(如
/admin/**
需要ROLE_ADMIN
) - 方法级别权限控制(使用
@PreAuthorize
、@Secured
注解) - 支持角色(Role)和权限(Authority)管理
3. 安全防护
- 防止 CSRF(跨站请求伪造)
- 防止 Session 固定攻击
- 支持安全头设置(如 HSTS、X-Frame-Options)
4. 安全上下文(SecurityContext)
- 使用
SecurityContextHolder
存储当前用户的安全信息(如登录用户) - 可通过
Authentication
获取当前用户信息
二、核心组件
组件 | 说明 |
---|---|
SecurityFilterChain |
安全过滤链,定义请求的安全规则 |
UserDetailsService |
加载用户信息(如从数据库加载) |
PasswordEncoder |
密码加密与验证 |
AuthenticationManager |
认证管理器,处理登录认证逻辑 |
GrantedAuthority |
用户拥有的权限或角色 |
SecurityContext |
当前请求的安全上下文,包含用户信息 |
三、Spring Security 的基本流程
plaintext
用户请求 → SecurityFilterChain → 认证(登录)→ 授权(权限判断)→ 允许/拒绝访问
四、Spring Boot 中的典型配置(Java Config)
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(withDefaults())
.logout(logout -> logout.permitAll())
.csrf(csrf -> csrf.disable()); // 开发阶段可关闭 CSRF
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("password")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
五、Spring Security 与 Shiro 的对比
对比项 | Spring Security | Apache Shiro |
---|---|---|
所属生态 | Spring 生态 | 独立框架 |
配置方式 | Java Config / XML | Java Config / INI |
易用性 | 复杂但强大 | 简单易用 |
集成难度 | 适合 Spring 项目 | 可用于任意 Java 项目 |
功能 | 更全面(OAuth2、CSRF、JWT 等) | 功能较基础 |
社区支持 | Spring 官方维护 | Apache 项目 |
六、常见使用场景
- 用户登录认证(表单、JWT、OAuth2)
- 前后端分离项目中的 Token 认证(如 JWT)
- 接口级别的权限控制(如
/api/user
需要ROLE_USER
) - 管理后台的权限控制(如
/admin/**
需要管理员角色) - 安全审计、日志记录、登录失败限制等
七、常用注解(需启用 @EnableMethodSecurity
)
java
@EnableMethodSecurity
public class SecurityConfig { ... }
注解 | 说明 |
---|---|
@PreAuthorize("hasRole('ADMIN')") |
方法执行前进行权限判断 |
@PostAuthorize |
方法执行后进行权限判断 |
@Secured("ROLE_ADMIN") |
支持角色级别的方法控制 |
@EnableMethodSecurity |
启用方法级别安全控制 |
八、总结
Spring Security 是目前 Java Web 安全领域最主流的框架,尤其在 Spring Boot 项目中被广泛使用。它提供了从认证、授权到安全防护的完整解决方案,虽然学习曲线较陡,但功能强大、扩展性强,是构建企业级安全系统的首选方案。