一、Spring Security 简介
Spring Security 是一个 Java 框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security 基于过滤器链的概念,可以轻松地集成到任何基于 Spring 的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需要选择适合的方式。此外,Spring Security 还提供了一些附加功能,如集成第三方身份验证提供商和单点登录,以及会话管理和密码编码等。总之,Spring Security 是一个强大且易于使用的框架,可以帮助开发人员提高应用程序的安全性和可靠性。
- 核心定位
Spring 生态的安全框架,基于AOP 和 Servlet 过滤器链实现,提供 Web 请求和方法调用级的认证(是否能访问系统)和授权(是否有权限操作),自包含部署无需额外配置文件。
- 技术选型
SSM 框架通常搭配 Shiro,Spring Boot/Spring Cloud 首选 Spring Security。
- 基础使用
引入 spring-boot-starter-security 依赖后,框架自动开启接口保护,默认生成用户名 user,密码控制台随机生成,跳转默认登录页。
二、核心认证流程
Spring Security 认证时序图:
1. 自定义 UserDetailService
对应图中 DaoAuthenticationProvider 调用 loadUserByUsername 的环节。你需要实现这个接口,告诉 Spring Security如何从你的数据源(数据库)加载用户信息,包括用户名、加密密码和权限列表。
2. 重写配置类 SecurityConfig
这是整个认证流程的总控台,对应图中的 DaoAuthenticationProvider 调用 passwordEncoder.matches()、UsernamePasswordAuthenticationFilter 和 AuthenticationManager。Spring Security 要求密码必须加密存储,BCryptPasswordEncoder 是推荐的实现,它会自动处理加盐和验证,防止彩虹表攻击。定义哪些 URL 需要保护,哪些可以公开访问。配置登录表单的参数和行为,让 UsernamePasswordAuthenticationFilter 知道从哪里获取用户名和密码。配置登出逻辑。构建 AuthenticationManager,它会自动使用你提供的 UserDetailsService 和 PasswordEncoder。
三、核心授权流程
Spring Security 授权时序图:
1. 配置 SecurityFilterChain(包含授权规则)
在原有的认证逻辑基础上添加授权规则逻辑,这是授权最核心的配置,对应时序图中 SecurityMetadataSource 获取权限规则的环节。
2. 方法级授权
在配置类 SecurityConfig 上加上 @EnableMethodSecurity(prePostEnabled = true) 注解,即开启 PreAuthorize/PostAuthorize 注解了。
具体应用如下:URL 级授权是'粗粒度'的(控制整个接口),方法级授权是'细粒度'的(控制单个业务方法);@PreAuthorize 在方法执行前验证权限,是最常用的方法级授权注解;支持 Spring EL 表达式,可直接引用方法参数、当前用户信息,实现灵活的权限判断。

