Spring Security 是一个功能极其强大且高度可定制的身份验证(Authentication)和访问控制(Authorization)框架。对于 Java 开发者来说,它的底层逻辑其实就是一串过滤器链(FilterChain)。
我们可以将它的核心技术点拆解为以下几个维度:
1. 核心架构:过滤器链 (Security Filter Chain)
Spring Security 的本质是一个 Servlet Filter。当你发起请求时,它会经过层层关卡。
-
DelegatingFilterProxy:将 Servlet 容器的生命周期与 Spring 的 ApplicationContext 连接起来。
-
FilterChainProxy:管理多个
SecurityFilterChain。 -
常用过滤器:
-
UsernamePasswordAuthenticationFilter:处理表单登录。 -
BasicAuthenticationFilter:处理 HTTP Basic 认证。 -
ExceptionTranslationFilter:捕获异常并决定是跳转登录页面还是返回 403。 -
FilterSecurityInterceptor:最终守门员,决定你有没有权限访问目标 URL。
-
2. 身份验证 (Authentication) —— “你是谁?”
这是 Spring Security 的第一大任务。
-
AuthenticationManager:认证的核心入口,通常使用其实现类
ProviderManager。 -
AuthenticationProvider:真正的认证执行者。你可以自定义它来对接指纹、短信验证码、LDAP 等。
-
UserDetailsService:核心接口。你通过实现它,从数据库中加载用户信息(用户名、密码、权限)。
-
PasswordEncoder:密码加密。现在默认推荐使用 BCryptPasswordEncoder(自带盐值的哈希算法)。
-
SecurityContextHolder:存放当前登录用户详情的容器。你可以通过
SecurityContextHolder.getContext().getAuthentication()在代码任何地方获取当前用户。
3. 权限控制 (Authorization) —— “你能干什么?”
认证通过后,系统会检查你的“通行证”是否有权进入某个房间。
-
基于请求的权限:在配置类中使用
.requestMatchers("/admin/**").hasRole("ADMIN")。 -
基于方法的权限:使用注解,如
@PreAuthorize("hasRole('ADMIN')")。这通常是通过 AOP 实现的。 -
RBAC 模型:Role-Based Access Control(基于角色的访问控制),是 Spring Security 最推荐的实践。
4. 常见的安全防护技术点
Spring Security 默认帮你开启了很多“隐形”的防护:
-
CSRF (跨站请求伪造) 防护:通过校验 Token 防止第三方网站伪造你的请求。
-
CORS (跨域资源共享):配置允许哪些域名的前端访问后端接口。
-
Session 管理:防止 Session 并发登录(比如同一个账号只能一人在线)、Session 固定攻击防护。
-
安全响应头:自动添加
X-Content-Type-Options、X-Frame-Options(防止点击劫持)等 HTTP 头。
5. 现代扩展:OAuth2 与 JWT
在分布式或微服务架构中,传统的 Session 往往不够用:
-
OAuth2 / OpenID Connect:用于第三方登录(微信、GitHub 登录)或者微服务间的授权。
-
JWT (JSON Web Token):无状态认证。Spring Security 可以通过自定义过滤器来解析请求头中的
Authorization: Bearer <token>。
6. 总结:技术选型建议
| 场景 | 推荐技术点 |
| 传统单体项目 | 表单登录 + Session + Thymeleaf/JSP。 |
| 前后端分离 (Vue/React) | 禁用 CSRF + JWT 过滤器 + Redis 存储 Token。 |
| 微服务架构 | Spring Cloud Security + OAuth2 (Resource Server)。 |
既然聊到了 Spring Security,你目前是在处理前后端分离的登录逻辑(如 JWT),还是在做基于角色的传统权限管理?我可以针对性地给你一个配置类的模板。