一、Shiro简介
1.什么是Shiro?
Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份 认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
2.Shiro 的特点
Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加 密。如下是它所具有的特点:
- 易于理解的 Java Security API;
- 简单的身份认证(登录),支持多种数据源(LDAP,JDBC 等);
- 对角色的简单的签权(访问控制),也支持细粒度的鉴权;
- 支持一级缓存,以提升应用程序的性能;
- 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
- 异构客户端会话访问;
- 非常简单的加密 API;
- 不跟任何的框架或者容器捆绑,可以独立运行。
3.核心组件
流程如下:
- Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息
- 使用Subject门面获取到封装着用户的数据的标识token
- Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager 把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm
- 认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法
二、 Spring Security简介
1.什么是Spring Security?
Spring Security是一个功能强大且高度可定制的,主要负责为Java程序提供声明式的身份验证和访问控制的安全框架。其前身是Acegi Security,后来被收纳为Spring的一个子项目,并更名为了Spring Security。Spring Security的底层主要是基于 Spring AOP 和 Servlet 过滤器来实现安全控制,它提供了全面的安全解决方案,同时授权粒度可以在Web请求级和方法调用级来处理身份确认和授权。
2.Spring Security功能
-
认证: 解决 "你是谁" 的问题-->解决的是系统中是否有这个“用户”(用户/设备/系统)的问题,也就是我们常说的“登录”。
-
授权: 权限控制/鉴别,解决的是系统中某个用户能够访问哪些资源,即“你能干什么”的问题。Spring Security 支持基于 URL 的请求授权、方法访问授权、对象访问授权。
-
防护攻击: 防止身份伪造等各种攻击手段。
-
加密功能: 对密码进行加密、匹配等。
-
会话功能: 对Session进行管理。
-
RememberMe功能: 实现“记住我”功能,并可以实现token令牌持久化。
三、Spring Security 与 Shiro对比
1. Spring Security优点
Spring Security基于Spring开发,所以Spring Security与Spring更契合;
Spring Security功能比Shiro更加强大,尤其是在安全防护方面;
Spring Security社区资源比Shiro更加丰富;
Spring Boot/Spring Cloud环境中,更容易集成Spring Security;
Spring Security 具备良好的扩展性,可以满足自定义的要求;
Spring Security对 OAuth2框架支持很好,而Shiro则对 OAuth2 支持不够。
2. Spring Security缺点
Shiro是一个轻量、简单、易于集成的老牌安全框架,而且使用流程简单清晰;反观Spring Security,则属于是重量级、配置繁琐、学习使用门槛高的安全框架。
Shiro依赖性低,不需要任何框架和容器,可以独立运行,而Spring Security需要依赖Spring容器。
3. 现在常见的安全技术栈
在目前的Java体系中,我们在进行关于安全方面的开发时,到底该选择Shiro还是Spring Security哪个框架呢?其实我们可以进行如下搭配:
- SSM + Shiro
- Spring Boot/Spring Cloud + Spring Security
就目前而言,Shiro 最大的问题在于和 Spring 家族的产品进行整合时较为不便。在Spring Boot 推出的很长一段时间里,Shiro 都没有提供相应的 starter,后来虽然有一个 shiro-spring-boot-web-starter 出来,但配置并没有简化多少。所以在 Spring Boot/Spring Cloud 技术栈的微服务项目中,Shiro 几乎不存在优势。