![]() | ![]() |
---|
一、一句话区分
- Spring Security:功能全但复杂,适合企业级复杂权限场景(比如银行系统)。
- Sa-Token:简单直接,适合中小项目快速开发(比如后台管理系统)。
二、直观对比(先看表格)
Sa-Token | Spring Security | |
---|---|---|
上手难度 | 1天能干活 | 1周能看懂文档 |
配置方式 | 注解+简单配置 | XML/Java配置+复杂继承体系 |
核心原理 | 拦截器+会话模型 | 过滤器链+权限表达式 |
代码量 | 10行代码实现登录 | 50行起步+各种类继承 |
社区资源 | 中文文档友好 | 英文文档+零散博客 |
扩展性 | 插件机制简单 | 深度定制需要理解底层 |
三、实现原理对比(从厕所门锁说起)
场景:给公司厕所加门禁
-
Sa-Token的做法:
- 门口挂个牌子:“刷工卡进入”(拦截器)
- 刷卡后记录"已授权"(会话存储)
- 每次进门查记录(权限校验)
-
Spring Security的做法:
- 安装虹膜识别+指纹验证+金属探测门(过滤器链)
- 需要填写《如厕申请表》(UserDetails)
- 每次进门走安检流程(SecurityContext)
- 不同坑位要不同权限(PreAuthorize)
核心差异:
Sa-Token像智能门锁(够用就好),Spring Security像机场安检(严苛但繁琐)。
四、优缺点深入(打工人版)
Sa-Token的优点:
- 中午就能上手:
@SaCheckLogin
注解搞定基础权限 - 会话管理灵活:Redis、数据库、内存存储随便换
- 踢人功能贴心:
StpUtil.kickout(1001)
一键踢下线 - 适合国人口味:中文文档+QQ群答疑
Sa-Token的缺点:
- 复杂权限吃力:动态权限需要自己扩展
- 生态局限:没有OAuth2全家桶
- 大厂背书弱:作者是个人开发者
Spring Security的优点:
- 权限控制到毛孔:支持方法级、URL级、甚至数据级权限
- 安全协议全家桶:OAuth2、LDAP、SAML全支持
- Spring亲儿子:和SpringCloud无缝整合
- 企业级审计:操作日志、安全事件监控
Spring Security的缺点:
- 配置劝退新人:一个登录配置要写3个类
- 概念迷宫:AuthenticationManager、ProviderManager、UserDetailsService…
- 过度设计:想改个登录页?先战胜20个默认配置
五、怎么选?(直接给答案)
-
选 Sa-Token 当:
- 项目要1周上线
- 只需要RBAC基础权限
- 团队新人多
- 老板天天催进度
-
选 Spring Security 当:
- 系统要过等保三级
- 需要对接第三方登录
- 权限要精确到按钮级别
- 团队有安全专家坐镇
六、代码对比(感受差异)
Sa-Token实现登录:
// 登录
StpUtil.login(1001);
// 校验权限
@SaCheckPermission("user:add")
public void addUser() {
// 业务代码
}
Spring Security实现同功能:
// 需要先继承WebSecurityConfigurerAdapter
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/user/add").hasAuthority("user:add")
.and().formLogin();
}
// 必须实现UserDetailsService
@Bean
public UserDetailsService userDetailsService() {
// 伪代码:查数据库
return username -> new User(username, password, authorities);
}
}
七、终极建议
- 新手村任务:用Sa-Token快速积累成就感
- 挑战副本:用Spring Security深入安全领域
- 最佳实践:中小项目Sa-Token + 复杂系统上Spring Security