Apache Shiro 的官网地址如下:
Apache Shiro 是一个简单易用且强大而灵活的开源 Java 安全框架,以下简称 Shiro。它干净利落地处理身份认证、授权以及企业会话管理和加密。Shiro 拥有易于理解的 API,你可以快速且容易地使用它来保护任何应用程序——从最小的移动应用程序到最大的 web 和企业应用程序。
Shiro 权限基础概念:
- 安全实体:就是被权限系统保护的对象,比如工资数据。
- 权限:就是需要被校验的行为,比如查看、修改等。
- 分配权限:把对某些安全实体的某些权限分配给某些人员。是向数据库里面添加数据、或是维护数据的过程
- 权限验证(权限匹配):判断某个人员或程序对某个安全实体是否拥有某个或某些权限。从数据库中获取相应数据进行匹配的过程。
- 权限的继承性:如果多个安全实体存在包含关系,而某个安全实体没有权限限制,则它会继承包含它的安全实体的相应权限。
- 权限的最近匹配原则:如果多个安全实体存在包含关系,而某个安全实体没有权限限制,那么它会向上寻找并匹配相应权限限制,直到找到一个离这个安全实体最近的拥有相应权限限制的安全实体为止。如果把整个层次结构都寻找完了都没有匹配到相应权限限制的话,那就说明所有人对这个安全实体都拥有这个相应的权限限制。
Shiro 能做什么:
- 认证:验证用户的身份
- 授权:对用户执行访问控制:判断用户是否被允许做某事
- 管理:在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。
- 加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥
- Realms:聚集一个或多个用户安全数据的数据源
- 单点登录(SSO)功能:为没有关联到登录的用户启用 “Remember Me“ 服务
Shiro 的主要功能架构图:
从上图中可以看到 Shiro 的四大核心部分:
- Authentication(身份验证):简称为 “登录”,即证明用户是谁。
- Authorization(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。
- Session Management(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
- Cryptography(加密):通过使用加密算法保持数据安全
其中 Shiro 还提供了以下扩展:
- Web Support:主要针对 web 应用提供一些常用功能。
- Caching:缓存可以使应用程序运行更有效率。
- Concurrency:多线程相关功能。
- Testing:帮助我们进行测试相关功能
- “Run As”:一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
- “Remember Me” :记住用户身份,提供类似购物车功能。
Shiro 概念层架构的 3 个核心组件图:
说明:
- Subject :正与系统进行交互的人,或某一个第三方服务。所有 Subject 实例都被绑定到(且这是必须的)一个 SecurityManager 上。
- SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject 进行交互时,实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作,可以将其概念比作为是 SpringMVC 中的前端控制器。
- Realms :本质上是一个特定安全的 DAO。当配置 Shiro 时,必须指定至少一个 Realm 用来进行身份验证或授权。Shiro 提供了多种可用的 Realms 来获取安全相关的数据。如关系数据库 (JDBC),INI 及属性文件等。可以定义自己 Realm 实现来代表自定义的数据源。
Shiro 架构图:
说明:
- Authenticator :执行对用户的身份验证(登录)的组件。Authenticator 从一个或多个 Realm 中获得数据以验证用户的身份。 若存在多个 realm,则接口 AuthenticationStrategy 会确定什么样算是验证成功(例如,如果一个 Realm 成功,而其他的均失败,是否登录成功)。
- Authorizer :权限管理器,主要用于用户的访问控制,验证用户能否访问应用中的受保护资源。
- SessionManager :session 管理器,可在任何应用或架构层一致地使用 Session API
- SessionDAO:SessionManager 执行 Session 持久化(CRUD)操作。
- CacheManager :对 Shiro 组件提供缓存支持。
- Cryptography:Shiro 的 API 大幅度简化 Java API 中繁琐的密码加密
- Realms:Shiro 通过 Realms 来获取相应的安全数据
Shiro 配置基础
Shiro 被设计成能够在任何环境下工作,从简单的命令行应用程序到企业群集应用。由于环境的多样性,使得 Shiro 可以使用多种配置机制。
users:
- ini 配置:ini 实际上是一个文本配置,包含了由唯一命名的项来组织的键 / 值对。
- [users] 部分允许定义一组静态的用户帐户
- 每行的格式:
username = password, roleName1, roleName2, …
roles:
- [roles] 部分允许把定义在 [users] 部分中的角色与权限关联起来
- 每行的格式:
rolename = permissionDefinition1, permissionDefinition2, …
- permissionDefinition 是一个任意的字符串,但大多数人将会使用符合 org.apache.shiro.authz.permission.WildcardPermission 格式的字符串。
注意:
- 如果一个独立的 permissionDefinition 需要被内部逗号分隔(例如,printer:5thFloor:print,info),则需要用户双引号环绕该定义,以避免错误解析。
- 如果角色不想关联权限,则不需要在 [roles] 部分把它们列出来。只需定义在 [user] 部分中定义角色名就足以创建尚不存在的角色。
- 仅定义非空的 [users] 或 [roles] 部分就将自动地触发 org.apache.shiro.realm.text.IniRealm 实例的创建