1、Shiro功能概述
Apache Shiro是一个功能强大且易于使用的 Java 安全框架,可执行身份验证、授权、加密和会话管理。
主要功能:
- Authentication:身份认证。登录时验证身份信息。
- Authorization:授权操作。访问控制的过程,即确定“谁”有权访问“什么”。
- SessionManager:会话管理。这的Session并不是我们的HttpSession。
- Cryptography:加密。使用加密算法确保数据安全。
扩展功能:
- Web Suppot:对于Web的支持,可以更简易的集成 Web 项目。
- Caching:缓存。登录授权后,把用户信息缓存起来,这样就不用每次都去数据库中查询,提高效率。
- Concurrency:并发性。通过其并发功能支持多线程应用程序。
- Testing:支持测试。
- Run As:允许用户采用其他用户的标识(如果允许)的功能。
- Remember Me:记住用户跨会话的身份,只需要在强制登录时登录。
2、Shiro的三大核心
掌握核心点对使用Shiro有很大的帮助:
整个流程就是:应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
Subject:主体,代表了当前 “用户”,这个“用户”是一个抽象的概念,它也可以是第三方程序,大体理解为任何与系统交互的“东西”都可以称为Subject。所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm:领域,Shiro 从Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作。
3、RBAC的概念
RBAC(Role-Based Access Control)就是基于角色的访问控制。三要素就是用户、角色、权限,概括来说就是用户拥有什么角色,这些角色被分配了哪些操作权限。后续案例中其实是最简单的一种数据模型,实际项目中还会存在部门、用户组啥的。
4、身份认证流程
大体看一下流程有助于我们后续搭建项目。
- 应用程序代码调用 Subject.login(token) 方法,这里要传入AuthenticationToken 。
- 将 Subject 实例委托给应用程序的 SecurityManager,实际身份验证工作开始
- 委托给封装的验证器进行身份验证。authenticator.authenticate(token)
- 通过回调AuthenticationStrategy来执行多域身份验证尝试,需要注意的是只要一个Realm时是不需要这个的
- 从图中可以看到我们可以Custom Realm(自定义Realm),将传入的AuthenticationToken和Realm匹配,成功匹配后会创建一个subject实例。
5、授权流程
- 当调用subject.hashRole*/checkRole*/isPermitted*/checkPermission*方法,传入相应参数。
- 仍然委托给Security Manager
- SecurityManager通过Authorizer的hashRole*/checkRole*/isPermitted*/checkPermission*方法验证是否拥有角色或资源
- Authorizer类hasRole方法内通过AuthorizingRealm的getAuthorizationInfo获取角色信息,AuthorizingRealm最后通过调用子类的doGetAuthrizationInfo获取用户角色集合,在通过集合的contains方法判断角色。】
大体意思也就是最后它会去我们自定义Realm中查找subject拥有的角色或资源是否包括传入的参数。