
引入
Spring Security 常用于身份验证、授权、安全上下文
- 身份验证 (Authentication): 验证用户的身份(例如,用户名/密码)。
- 授权 (Authorization): 确定用户是否有权限访问特定资源。
- 安全上下文 (Security Context): 存储已认证用户的详细信息,应用程序中可以访问。
Spring Security 的整体原理为:
- 当 http 请求进来时,使用 severlet 的 Filter 进行拦截
- 提取 http 中请求的认证信息,如 username 和 password ,或者 Token
- 比对验证,相同则认证成功,反之失败
准备工作
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>3.3.4</version>
</dependency>
默认实现
一个请求过来 Spring Security 的处理过程(调用链)如下所示:

- Filter:拦截Http请求,获取认证信息
- AuthenticationManager:从 Filter 中获取认证信息,然后查找合适的 AuthenticationProvider 来发起认证流程
- AuthenticationProvider:调用 UserDetailsService 来查询用户信息并与从 http 请求中获取的认证信息进行比对
- UserDetailsService:负责获取用户保存的认证信息
使用 Token 认证方案
在实际生产环境中,一般结合 Token 来做认证
用户认证流程
用户登录
- 前端:
- 用户在登录界面输入用户名和密码。
- 前端将这些凭证以 JSON 格式发送到后端的登录 API(例如
POST /api/login)。
- 后端:
- Spring Security 接收请求,使用
AuthenticationManager进行身份验证。 - 如果认证成功,后端生成一个 JWT(JSON Web Token)或其他认证令牌,并将其返回给前端。
- Spring Security 接收请求,使用
使用 JWT 进行用户认证
- 前端收到 JWT 后,可以将其存储在
localStorage或sessionStorage中,以便后续请求使用。 - 在发送需要认证的请求时,前端将 JWT 添加到请求头中,如:
fetch('/api/protected-endpoint', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
});
- 后端解析 JWT:Spring Security 通过过滤器来解析和验证 JWT。可以自定义一个
OncePerRequestFilter以拦截请求,提取 JWT,并验证其有效性。
退出登录
由于 JWT 是无状态的,后端不需要记录会话状态。用户可以通过前端操作(例如,删除存储的 JWT)来“退出登录”。可以实现一个注销接口,用于前端执行相关逻辑。
References
spring security 超详细使用教程(接入springboot、前后端分离)
秒懂SpringBoot之全网最易懂的Spring Security教程
Comments NOTHING