Apache Shiro 架构提出了3个核心概念:Subject
,SecurityManager
,Realms
Subject
特指【当前用户】,这里的【用户】可以是实体世界的用户(人),也可以是第三方进程、守护进程或类似概念,代表【当前正在与软件进行交互的任何事物】。可以使用如下代码获取 Subject
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();
一旦获取 Subject
后便可以执行诸如登录、注销、访问会话、执行授权检查等 Shiro 负责的功能。
SecurityManager
Subject
对应 SecurityManager
,Subject
代表当前用户的安全操作,而 SecurityManager
管理所有用户的安全操作。SecurityManager
是 Shiro 架构的核心,引用了许多 Shiro 生成的内部嵌套的安全组件,这些组件构成了一副对象图。一旦 SecurityManager
配置完成,应用开发人员只需关注 Subject
API。
如何配置 SecurityManager
取决于开发应用类型和环境,譬如 Web 应用通常在 web.xml
中添加 Shiro Servlet Filter
,应用启动会自动生成 SecurityManager
实例。基于 Spring 或 Spring Boot 开发则更加简单,只需通过 XML 或 Java Config 注入一个 SecurityManager
实例即可。
通常来说 SecurityManager
是以单例形式存在于应用中。
Realms
一个 Realm
充当 Shiro 与应用程序安全数据间的【桥接器】。Shiro 会从已配置的一个或多个 Realm
中查找用于执行身份验证与授权等安全操作需要的安全数据,如用户账户。
Realm
本质上是一种安全相关的 DAO
(Data Access Object)。配置Shiro时,必须至少指定一个 Realm
用于身份验证和/或授权,当然也可以配置多个,但至少需要一个。
Shiro 本身提供了许多开箱即用的 Realms
,可以连接到不同的安全数据源,如 LDAP
、JDBC
、INI
、PROPERTIES
等。开发人员可以植入基于特定实现的 Realm
表示自定义数据源。