Apache Shiro是一个强大且易用的Java安全框架,用于身份验证、授权、加密和会话管理等。
Shiro 能做什么
认证:验证用户的身份;
授权:对用户执行访问控制:判断用户是否被允许做某事;
管理:在任何环境下使用 Session API,即使没有 Web 或EJB 容器。
加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥;
Realms:聚集一个或多个用户安全数据的数据源;
单点登录(SSO)功能:为没有关联到登录的用户启用 "Remember Me“ 服务;
图1-1 Shiro 的主要功能
Shiro 架构 3 个核心组件
3个核心组件:Subject, SecurityManager 和 Realms ;
图1-2 Shiro 3大核心组件
Subject :正与系统进行交互的人,或某一个第三方服务。所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。
SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject 进行交互时,实质上是幕后的 SecurityManager 处理所有繁重的Subject 安全操作。
Realms :Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。Shiro 提供了多种可用的 Realms 来获取安全相关的数据。如关系数据库(JDBC),INI 及属性文件等。可以定义自己 Realm 实现来代表自定义的数据源。
授权Authorization
授权:又称访问控制—控制谁有权限在应用程序中做什么。
授权检查的例子:用户是否能访问某个网页,编辑数据,或打使用这台打印机。
授权的三要素:权限、角色和用户 。
需要在应用程序中对用户和权限建立关联:通常的做法是将权限分配给角色,然后将角色分配给一个或多个用户。
权限:Shiro 安全机制最核心的元素。它在应用程序中明确声明了被允许的行为。一个格式良好的权限声明可以清晰表达出用户对该资源拥有的权限。在 Shiro 中主要通过通配符表达式来完成权限的描述。
Shiro 的权限Permissions
基础语法之简单的字符串:即用简单的字符串来表示一个权限,如:user (相当于:user:*);
基础语法之多层次管理:
例如:user:query、user:edit
多个值:每个部件能够保护多个值。因此,除了授予用户 user:query 和 user:edit 权限外,也可以简单地授予他们一 个:user:query, edit ;
还可以用 * 号代替所有的值,如:user:* , 也可以写:*:query,表示某个用户在所有的领域都有 query 的权限
基础语法之实例级访问控制:
这种情况通常会使用三个部件:域、操作、被付诸实施的实例。如:user:edit:manager
也可以使用通配符来定义,如:user:edit:*、user:*:*、user:*:manager
部分省略通配符:缺少的部件意味着用户可以访问所有与之匹配的值,比如:user:edit 等价于 user:edit :*、user 等价于 user:*:*
注意:通配符只能从字符串的结尾处省略部件,也就是说 user:edit 并不等价于 user:*:edit
角色Role
角色:一个命名的实体, 通常代表一组行为或职责。 这些行为演化为在一个应用中能或者不能做的事情。角色通常分配给用户帐户。
一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有指定的权限。这种角色权限可以对该角色进行详细的权限描述。 Shiro官方推荐使用这种方式。
Shiro的三种授权方式:
- 编写代码:在 Java 代码中用像 if 和 else 块的结构执行授权检查。
- JDK 的注解:可以添加授权注解给 Java 方法
- JSP 标签库:可以控制基于角色和权限的JSP 页面输出。
参考文献:
https://blog.youkuaiyun.com/weixin_42183336/article/details/81584467