1 Apache Shiro 简介

Apache Shiro 是 Java 的一个安全框架,不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
Shiro 功能覆盖:认证、授权、加密、会话管理、集成 Web、缓存等。
1 Apache Shiro 简介_第1张图片
Authentication
身份认证(登录),验证用户身份。
Authorization
授权,即权限验证,在 Authentication 基础上验证已认证用户是否拥有某些权限,如验证已认证用户是否拥有某些角色,在更细粒度上验证已认证用户是否对某种资源拥有某种权限。
Session Management
会话管理,用户验证通过后就对应一个会话,在用户退出之前所有信息都保存在会话中,会话既可以存在于普通的 JavaSE 环境,也可以存在于 Web 环境。
Cryptography
加密,保证数据安全性。
Web Support
支持 Web 应用,可以集成到 Web 环境中。
Caching
缓存,如用户登录后,用户信息、拥有的角色、权限等都保存在缓存中以提升效率。
Concurrency
支持多线程应用的并发验证,如在一个线程中开启另一个线程可以将权限自动传播过去。
Testing
提供测试支持。
Run As
允许一个用户借用另一个用户(如果被允许)的身份进行访问。
Remember Me
记住我功能,成功登录一次后不用再次登录。

从应用开发角度观察 Shiro 工作流程:
1 Apache Shiro 简介_第2张图片
可以看到应用代码直接交互的对象是 Subject,也就是说 Shiro 的对外 API 核心就是 Subject。
Subject
主体,代表了当前“用户”。这个“用户”不一定是一个具体的人,与当前应用交互的任何东西都可以是 Subject,如网络爬虫、机器人等。Subject 是一个抽象概念,当然通常情况下都对应人。所有的 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager。可以将 Subject 理解为一个门面,SecurityManager 才是实际执行者。
SecurityManager
安全管理器,所有与安全相关的操作都会与 SecurityManager 交互。SecurityManager 管理所有的 Subject,是 Shiro 的核心,负责与其他组件进行交互。可以将 SecurityManager 类比 SpringMVC 的 DispatcherServlet(前端控制器)。
Realm
域,SecurityManager 通过 Realm 获取安全数据(如用户、角色、权限),即如果 SecurityManager 需要验证用户身份,则需要通过 Realm 获取对应用户进行比较以确定用户身份是否合法;如果需要验证用户权限,则需要通过 Realm 获取对应用户的角色/权限进行验证以确定用户是否可以执行相应操作。可以将 Realm 看成 DataSource,即安全数据的数据源。
通过以上说明可以得出,开发一个最简单的 Shiro 应用:
1. 应用代码通过 Subject 进行认证和授权,而 Subject 委托给 SecurityManager;
2. 需要给 SecurityManager 注入 Realm,让 SecurityManager 得到合法的用户及其权限,从而进一步判断。
从以上也可以看出,Shiro 不提供维护用户和权限,需要开发人员自己实现 Realm 注入进 SecurityManager。

从 Shiro 内部观察 Shiro 架构:
1 Apache Shiro 简介_第3张图片
Subject
主体,可以是任意与应用交互的“用户”。
SecurityManager
相当于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher,是 Shiro 的核心,所有具体交互都通过 SecurityManager 进行控制。SecurityManager 管理所有 Subject,且负责进行认证和授权、会话及缓存管理。
Authenticator
认证器,负责主体认证,用户可以自定义实现,需要认证策略(Authentication Strategy),即满足什么条件用户认证算通过。
Authorizer
授权器,即访问控制器,决定主体是否有权限进行相应操作,控制用户能访问应用中哪些功能。
Realm
可以有1个或多个 Realm,可以认为是安全实体数据源,用于获取安全实体。可以是 JDBC 实现,也可以是 LDAP 实现或者内存实现等等。注意:Shiro 并不知道用户、权限等数据是以哪种格式存储在何处,通常开发人员需要自定义 Realm 实现。
SessionManager
如果写过 Servlet 就知道 Session 概念,此处的 SessionManager 用于管理 Session 的生命周期。Shiro 不仅可以用在 Web 环境,也可以用在 JavaSE、EJB 等环境。Shiro 抽象出一个自己的 Session 来管理主体与应用之间交互的数据。
SessionDAO
用户会话的 CRUD,比如想把 Session 保存到数据库,那么可以实现自己的 SessionDao,通过 JDBC 等方式写到数据库;比如想把 Session 放到 Memcached 中,可以实现自己的 Memcached SessionDao;另外 SessionDao 中可以使用 Cache 进行缓存以提高性能。
CacheManager
缓存控制器,用于管理用户、角色、权限等缓存,因为这些数据基本很少改变,所以放到缓存中可以提高访问性能。
Cryptography
密码,Shiro 提供一些常见的加密组件用于密码加解密。

你可能感兴趣的:(Apache,Shiro)