Shiro架构
Apache Shiro Architecture
Apache Shiro的设计目的是为了简化应用系统鉴权,它将系统与外界的交互进行了高度的抽象。
应用软件通常都是基于用户来设计的,也就是说,基于用户会以怎样的一种方式或者应该以一种怎样的方式来与系统进行交互。例如,如果登陆的用户可以查看自己的账户信息,未登陆的用户则可以执行登陆或者注册行为。
应用系统的设计的目的是为了满足用户需求,用户可以是自然的人,或者其它的应用系统。。
High-Level Overview
从最高层抽象来看,Shiro架构包含三个重要的概念,Subject
, SecurityManager
and Realms
. 如下的流程图展示了各个组件之间是如何交互的:
-
Subject:
Subject
就是我们所说的用户,Subject
可以是一个自然人、第三方系统、独立的账户或者定时任务等任何类似的和系统进行交互的对象。所有Subject
实例都必须绑定SecurityManager并交由
SecurityManager进行交互管理。
-
SecurityManager:
SecurityManager是Shiro框架的核心,是内部安全组件交互的协调者。通常在开发中,
SecurityManager及其内部组件可以通过
配置来使用,开发者则更多的专注于和用户交互的SubjectAPI开发中。 -
Realms: Realms 是连接Shiro和系统安全数据之间的桥梁,当用户和系统的交互涉及到系统安全数据时(如:通过执行身份认证及访问授权),Shiro需要通过配置的一个多个Realms来获取认证账户信息。
在这种场景下,Realm担任着DAO角色,它包装了数据源连接细节,并且提供Shiro需要的相关数据。Shiro配置至少需要配置一个Realm来执行认证和授权。
SecurityManager
需要配置至少一个Realm配置。Shiro提供了一些立即可用的Realm,包括连接LDAP、JDBC数据源,JNDI数据源及属性文件等。你也可以使用自己实现的Realm作为客户化的数据源为Shiro提供权限数据。
SecurityManager
管理着Realms获取权限信息,并转化为使用的Subject
实例。
Detailed Architecture
Shiro 流程图:
-
Subject (
org.apache.shiro.subject.Subject
)
系统交互对象。 -
SecurityManager (org.apache.shiro.mgt.SecurityManager)
管理用户访问。 -
Authenticator (org.apache.shiro.authc.Authenticator)
TheAuthenticator
身份认证组件,协调相关realm执行用户登录认证逻辑-
Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)
多realm认证决策
-
-
Authorizer (org.apache.shiro.authz.Authorizer)
访问控制者,通过特定的访问决策机制,获取相关角色及权限信息,决定用户的访问请求的合法性。 -
SessionManager (org.apache.shiro.session.mgt.SessionManager)
创建并管理用户会话生命周期。Shiro可以在任何环境下本地化的管理用户会话,即使没有Web/servlet或者EJB容器。默认情况下,Shiro会使用环境会话管理机制,当然,Shiro也可以使用内置的会话管理机制来提供相同的功能。Shiro SessionDAO可以提供任何数据源的会话持久机制。-
SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO)
SessionDAO
通过SessionManager
提供Session 的持久化
(CRUD) 操作, 支持任何数据存储。
-
-
CacheManager (org.apache.shiro.cache.CacheManager)
TheCacheManager
提供Shiro缓存生命周期管理。因为Shiro需要访问很多后台的身份认证,访问控制及会话管理信息。缓存机制能够在很大程度上提升Shiro框架性能。Shiro支持使用任何开源的或者企业缓存产品。 -
Cryptography (org.apache.shiro.crypto.*)
加密机制。 -
Realms (org.apache.shiro.realm.Realm)
同上。
The SecurityManager
Shiro API 鼓励Subject导向的开发。大多数情况下,开发者也不需要过多的操作 SecurityManager
。