一、概述
Apache Shiro 是一个强大且易用的 Java 安全框架,旨在提供身份验证、授权、加密、会话管理等一系列的安全功能。它可以帮助开发者快速、轻松地保护从最小的移动应用程序到最大的网络和企业应用程序的各种应用。Shiro 的设计理念是简单直观,易于理解和使用,旨在为用户提供一站式的安全解决方案。
官网:https://shiro.apache.org/
二、为什么要用 Shiro
- 易用性:Shiro 提供了简洁易懂的 Java Security API,即使对于初次接触安全框架的开发者来说,也能快速上手并掌握其使用方法。
- 全面性:Shiro 包含了系统安全框架所需的各种功能,如身份验证、授权、加密等,可以满足不同应用场景下的安全需求。
- 灵活性:Shiro 可以在任何应用环境中工作,无需依赖特定的框架或容器。它可以在 Web、EJB、IoC 等环境中无缝集成,也可以独立运行。
- 强力支持 Web:Shiro 提供了对 Web 应用的强力支持,允许开发者基于应用 URL 和 Web 协议(如 REST)创建灵活的安全策略。同时,它还提供了一套 JSP 标签库来控制页面输出。
- 兼容性:Shiro 的设计模式使其易于与其他框架和应用程序集成。它可以与 Spring、Grails、Wicket、Tapestry、Mule、Apache Camel、Vaadin 等框架无缝集成。
- 社区支持:Shiro 是 Apache 软件基金会的一个开源项目,拥有完备的社区支持和文档支持。如果需要专业的支持和服务,还可以联系像 Katasoft 这样的商业公司。
三、Shiro 与 Spring Security 的对比
虽然 Spring Security 和 Shiro 都是 Java 安全框架,但它们在某些方面存在差异:
- Spring Security 基于 Spring 开发,更适合在 Spring 项目中使用。而 Shiro 则可以与任何 Java 项目集成。
- Spring Security 功能更为丰富,尤其在安全维护方面。而 Shiro 则更加注重易用性和灵活性。
- Spring Security 的社区资源相对丰富,但 Shiro 的社区也非常活跃和友好。
- Shiro 的配置和使用相对简单,而 Spring Security 的上手难度稍高。
四、基本功能
- Authentication(身份验证):验证用户是否拥有相应的身份。
- Authorization(授权):验证已认证的用户是否拥有某个权限,即判断用户是否能进行特定操作。
- Session Manager(会话管理):管理用户的会话信息,如登录状态、会话超时等。
- Cryptography(加密):提供数据加密功能,保护数据的安全性。
- Web Support(Web 支持):提供对 Web 应用的支持,包括基于 URL 和 Web 协议的安全策略以及 JSP 标签库等。
- Caching(缓存):提供缓存功能,提高应用性能。
- Concurrency(并发支持):支持多线程应用的并发验证。
- Testing(测试支持):提供测试支持,方便开发者进行安全测试。
- Run As(伪装功能):允许一个用户伪装成另一个用户(如果他们允许)的身份进行访问。
- Remember Me(记住我功能):提供“记住我”功能,方便用户下次访问时无需重新登录。
五、原理
Shiro 的核心组件包括 Subject、SecurityManager 和 Realms。Subject 代表了当前用户或与应用交互的任何实体;SecurityManager 是 Shiro 的核心,负责管理所有用户的安全操作;Realms 充当了 Shiro 与应用安全数据间的“桥梁”或“连接器”,负责提供用户及其权限信息给 Shiro。通过这三个组件的协同工作,Shiro 可以实现身份验证、授权等安全功能。
- (1)Subject:任何可以与应用交互的“用户”;
- (2)SecurityManager :相当于 SpringMVC 中的 DispatcherServlet;是 Shiro 的心 脏; 所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负 责进 行认证、授权、会话及缓存的管理。
- (3)Authenticator:负责 Subject 认证,是一个扩展点,可以自定义实现;可以使用认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
- (4)Authorizer:授权器、即访问控制器,用来决定主体是否有权限进行相应的操作;即 控 制着用户能访问应用中的哪些功能;
- (5)Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实 体 的;可以是 JDBC 实现,也可以是内存实现等等;由用户提供;所以一般在应用中都需 要 实现自己的 Realm; (6)SessionManager:管理 Session 生命周期的组件;而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境
- (7)CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据 基本上很少改变,放到缓存中后可以提高访问的性能
- (8)Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解 密。