Spring Security是Spring生态中的安全框架,用于管理Web应用的认证与权限控制,支持多种登录方式并集成防护机制,可防范CSRF/XSS等攻击,保障企业级系统的安全性。
一、核心功能与定位
-
身份认证(Authentication) 验证用户身份,支持多种认证方式:
-
表单登录:传统用户名/密码登录。
-
OAuth2/JWT:适用于前后端分离或第三方登录场景。
-
LDAP/HTTP Basic:集成企业目录服务或简单 API 认证。
-
-
授权(Authorization) 控制用户访问资源的权限:
-
基于角色(Role):如ADMIN、USER等粗粒度控制。
-
基于权限(Authority):细粒度控制(如read、write)。
-
方法级安全:通过@PreAuthorize注解动态校验权限。
-
-
攻击防护 内置防御常见 Web 攻击:
-
CSRF(跨站请求伪造):自动生成并验证 Token
-
会话固定攻击:用户登录后重置 Session ID。
-
安全响应头:自动添加X-Content-Type-Options等防护头。
-
二、架构与核心设计
-
过滤器链(Filter Chain)
-
通过DelegatingFilterProxy拦截 HTTP 请求,由一系列安全过滤器(如UsernamePasswordAuthenticationFilter)处理认证、授权等逻辑。
-
典型流程:请求 → 认证过滤器 → 授权校验 → 资源访问。
-
-
核心组件
-
SecurityContextHolder
:存储当前用户的安全上下文(如认证信息)。 -
UserDetailsService
:加载用户数据(如从数据库或内存),返回UserDetails象。 -
AuthenticationManager
:协调认证流程,委托给DaoAuthenticationProvider等实现。
-
三、关键优势
-
深度集成 Spring 生态
-
无缝兼容 Spring Boot、Spring MVC,支持自动配置(如默认启用基础安全规则)。
-
通过@EnableWebSecurity快速启用安全模块。
-
-
模块化与可扩展性
-
支持按需扩展认证方式(如自定义UserDetailsService)。
-
提供 Servlet 应用(spring-security-web)和 Reactive 应用(spring-security-reactive)独立模块。
-
-
企业级安全实践
-
遵循 纵深防御(Defense in Depth)原则,从网络层到数据层多层防护。
-
支持 密码加密(BCrypt/SCrypt)、HTTPS 强制、会话并发控制等。
-
四、典型应用场景
场景 | 技术方案 | 示例 |
---|---|---|
传统 Web 应用 | 表单登录 + 会话管理 | 后台管理系统,基于角色控制菜单权限。 |
前后端分离架构 | JWT/OAuth2 + 无状态配置 | RESTful API 使用 JWT 令牌认证,禁用 Session。 |
微服务安全 | Spring Cloud Security + OAuth2 授权服务器 | 微服务间通过令牌中继(Token Relay)传递身份。 |
五、与 Shiro 的对比
特性 | Spring Security | Apache Shiro |
---|---|---|
集成 Spring | ✅ 深度无缝集成 | ⚠️ 需手动适配 |
功能范围 | 认证、授权、攻击防护、会话管理全覆盖 | 侧重认证和授权,防护能力较弱 |
学习曲线 | 较陡峭(配置复杂) | 更简单易用 |
适用规模 | 中大型企业级项目 | 中小型项目 |
六、典型案例展示
1.基础Web应用安全(单体架构)
-
表单登录+URL权限控制
-
场景:传统后台管理系统(如OA系统)
-
核心配置
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll() // 公开路径.antMatchers("/admin/**").hasRole("ADMIN") // 管理员权限.anyRequest().authenticated() // 其他路径需登录.and().formLogin() // 启用表单登录.loginPage("/login") // 自定义登录页.permitAll();} }
-
特点:
-
默认生成登录页,支持自定义UI(Thymeleaf模板)
-
内存用户认证(auth.inMemoryAuthentication())或数据库用户认证扩展
-
-
-
前后端分离架构(RESTful API安全)
-
JWT无状态认证
-
场景:移动端/前端调用API接口
-
实现流程:
-
-
关键代码:
// JWT过滤器
public class JwtFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = request.getHeader("Authorization");if (token != null) {Authentication auth = jwtUtil.parseToken(token); // 解析TokenSecurityContextHolder.getContext().setAuthentication(auth); // 注入安全上下文}chain.doFilter(request, response);}
}
-
配置要点:
-
禁用Session(
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
) -
开放登录接口(.antMatchers("/auth/login").permitAll())
-
-
方法级注解控制
-
使用@PreAuthorize实现细粒度授权:
@RestController public class UserController {@GetMapping("/api/user/{id}")@PreAuthorize("hasAuthority('READ_USER')") // 需READ_USER权限public User getUser(@PathVariable Long id) { ... } }
-
-
微服务安全(OAuth2 + JWT)
-
OAuth2授权服务器
-
场景:多服务统一认证(如电商系统)
-
架构:
-
-
资源服务器配置:
@EnableResourceServer
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/**").authenticated(); // 保护API路径}
}
3.自定义认证与数据库集成
-
JDBC用户认证服务
-
场景:从数据库动态加载用户权限
-
实现步骤:
-
创建用户表(含
username
,password
,roles
字段) -
实现UserDetailsService接口:
@Service public class JdbcUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) {User user = userRepository.findByUsername(username);List<GrantedAuthority> authorities = user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).collect(Collectors.toList());return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);} }
-
配置密码编码器(推荐BCrypt):
@Bean public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(); }
-
-
六、总结
Spring Security 是 Spring 应用安全的基石,通过 模块化设计 和 深度可定制性 满足从单体应用到微服务的复杂需求。其核心价值在于:
-
标准化安全流程:提供认证、授权、防护的一站式解决方案;
-
企业级可靠性:内置最佳实践(如 CSRF 防护、密码加密);
-
生态整合优势:与 Spring Boot、Spring Cloud 协同简化配置。