Spring Security vs Shiro vs Sa-Token
一句话总结:
- Spring Security:大公司专业保安队,功能全面但配置复杂
- Shiro:轻便灵活的安保工具包,上手简单但功能有限
- Sa-Token:国产智能门禁系统,开箱即用,代码极简
对比表格(核心差异)
特性 | Spring Security | Shiro | Sa-Token |
---|---|---|---|
学习成本 | 高(需要理解整套安全体系) | 中(模块化设计) | 低(注解驱动,API简单) |
配置复杂度 | 复杂(XML/JavaConfig) | 中等(INI配置或Java) | 极简(几乎零配置) |
功能覆盖 | 全(认证、授权、OAuth2等) | 基础认证+授权 | 基础认证+授权+踢人下线等 |
代码量 | 多(模板代码多) | 中等 | 少(一行注解完成校验) |
社区生态 | 国际主流(Spring家族) | 国际活跃(Apache项目) | 国内活跃(Gitee高星) |
类比解释:
场景:公司安保系统
-
Spring Security
- 像一个专业保安公司,提供 全套方案:门禁、监控、消防、访客登记。
- 但需要你 画图纸、写流程(配置复杂),适合大型集团(复杂系统)。
- 例子:配置一个OAuth2登录需要写200行代码。
-
Shiro
- 像一套 标准化安保工具包(门锁+摄像头+手电筒)。
- 你可以自由组合(模块化),但 高级功能要自己造轮子(如分布式会话)。
- 例子:实现“记住我”功能需要手动处理Cookie和缓存。
-
Sa-Token
- 像一套 智能门禁系统,喊一声“开门”就能用(注解驱动)。
- 自带 实用小功能:一键踢人下线、自动续签token、多账号体系隔离。
- 例子:踢人下线只需一行代码:
StpUtil.kickout(10001);
代码对比(登录校验)
1. Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/profile").authenticated() // 登录校验
.and().formLogin();
}
}
// 需要搭配UserDetailsService和PasswordEncoder配置
2. Shiro
// 1. 编写Shiro过滤器配置
@Bean
public ShiroFilterFactoryBean shiroFilter() {
ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
filter.setFilterChainDefinitionMap(Map.of("/profile", "authc")); // 登录校验
return filter;
}
// 2. 实现Realm类处理认证逻辑(需手动写代码)
3. Sa-Token
@SaCheckLogin // 直接加注解,结束!
@GetMapping("/profile")
public String profile() {
return "用户信息";
}
应用场景推荐
- 选 Spring Security:
企业级应用、需要OAuth2/单点登录/微服务安全、深度集成Spring生态。 - 选 Shiro:
小型项目、快速上手、需要灵活定制权限模型。 - 选 Sa-Token:
中小型项目、追求代码简洁、需要快速实现踢人/多端登录等功能。
面试加分回答
-
Sa-Token 的优势:
- 独创 “无Cookie”模式(解决跨域难题)
- 自带 路由拦截鉴权(类似网关权限控制)
- 分布式会话只需引入Redis(无需额外代码)
-
Spring Security 的痛点:
- 学习曲线陡峭(如 SecurityContextHolder 的设计)
- 重复造轮子(如用
@PreAuthorize
时仍需手动处理权限表)
-
Shiro 的不足:
- 默认会话管理不适合分布式场景
- 注解功能弱(如不支持SpEL表达式)
一句话收尾
- Spring Security 是航母,Shiro 是瑞士军刀,Sa-Token 是智能工具箱 —— 根据业务规模和技术栈选最顺手的即可!