一、名词解释

1、Subject:即" 当前操作用户 "。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。(主体要访问系统、系统需要对主体进行认证、授权。)

2、SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。(主体通过验证和授权都是通过SecurityManager进行的。)

3、Realm:Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。(通过realm存取认证、授权相关数据)

应用代码通过subject来进行认证和授权,而subject又委托给SecurityManager,我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能够得到合法的用户及其权限进行判断。因此Shiro是不提供维护用户/权限的,而是通过Realm让开发者自己注入

4、cacheManager:缓存管理器,主要对session和授权数据进行缓存,比如将授权数据通过cacheManager进行缓存管理,和ehcache整合对缓存数据进行管理。

5、sessionManager:web应用中一般是用web容器对session进行管理,shiro提供一套session管理的方式。

6、sessionDao:通过sessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao。

7、cryptography:密码模块,用于加密/解密的。

二、Shiro如何来完成权限验证?

通过调用Subject.hasRoles(…) 或 Subject.isPermitted(…) 和 Subject.checkRoles(…) 或 Subject.checkPermissions(…)

两种的区别是后两种检验在没有权限时会抛出异常。

关于权限的定义,在Shiro中可以这么来定义权限字符串:资源标识符 : 操作 : 对象实例ID。另外这里支持通配符配置。

Shiro内部有一个PermissionResolver来负责将这类字符串解析为Permission对象。

授权的流程:

1、当我们调用Subject.hasRole(…)后

2、首先会委托给securityManager来处理,而securityManager内部有一个Authorizer来做真正的授权,默认实现为ModularRealmAuthorizer。

3、ModularRealmAuthorizer可以根据多个Realm来判断是否拥有相应的角色,其中只要某个Realm匹配,则返回true。

4、AuthorizingRealm对于判断hasRole的逻辑也很简单

    protected boolean hasRole(String roleIdentifier, AuthorizationInfo info) {return info != null && info.getRoles() != null && info.getRoles().contains(roleIdentifier);}

而对于Subject.isPermitted(…)稍微会显得复杂一些,前三步都一样,就是 AuthorizingRealm对于判断 isPermitted的逻辑稍微有点不一样。它会先将权限字符串转换成 Permission,将用户的权限转换成List,这里的List由三个部分组成:

1、通过AuthorizationInfo.getObjectPermissions()得到Permission实例集合。
2、通过AuthorizationInfo. getStringPermissions()得到字符串集合并通过PermissionResolver解析为Permission实例。

3、然后获取用户的角色,并通过RolePermissionResolver解析角色对应的权限集合(默认没有实现,可以自己提供)。

而JdbcRealm的实现是使用了stringPermissions,接下来,用Permission和List进行匹配,其中遍历用户权限的匹配方法就是implies(…),这个单词可以理解成“蕴含”的意思:

   private boolean isPermitted(Permission permission, AuthorizationInfo info) {Collection<Permission> perms = getPermissions(info);if (perms != null && !perms.isEmpty()) {for (Permission perm : perms) {if (perm.implies(permission)) {return true;}}}return false;}

使用声明式的鉴权需要启用aspectJ自动代理,并支持对类的代理。

 <aop:aspectj-autoproxy proxy-target-class="true" /><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager" /></bean>

鉴权流程:

服务端将页面传来的权限信息和缓存中权限信息比较,有权限则返回true,否则返回false。

shiro中的isPermitted方法:

public boolean isPermitted(PrincipalCollection principals, String permission) {  Permission p = getPermissionResolver().resolvePermission(permission);  return isPermitted(principals, p);
}  public boolean isPermitted(PrincipalCollection principals, Permission permission) {  AuthorizationInfo info = getAuthorizationInfo(principals);  return isPermitted(permission, info);
}

isPermitted会先将传进来的权限字符串转化为shiro的Permission实例;接着回去获取授权信息AuthorizationInfo;获取授权信息时,它是先从缓存中获取,如果缓存中没有,则会调用doGetAuthorizationInfo(principals)获取。doGetAuthorizationInfo(principals)是在自定义realm域中重写的授权方法。

shiro不提供角色和权限的维护,如果程序其他地方要用到权限或角色信息,或者如果需要在应用中判断用户是否有相应角色,用户是否有权限,就需要在相应的Realm中返回角色、权限信息,所有的信息都可以通过SecurityUtils.getSubject()来获取。

对于角色的控制访问,shiro提供了checkRole/checkRoles 和 hasRole/hasAllRoles 不同的地方是前者它在判断为假的情况下会抛出UnauthorizedException异常。

对于权限的控制访问,shiro提供了isPermitted/isPermittedAll 和 checkPermission/checkPermissions 不同的地方在于后者它在判断为假的情况下会抛出UnauthorizedException异常。

Shiro 入门教程相关推荐

  1. Shiro教程八步曲(一)Shiro入门,小白菜鸟,也能看懂学会!

    Shiro入门 Shiro 是当下常见的安全框架,主要用于用户验证和授权操作. Shiro 有相当的复杂性,为了使得学习更加平滑,本系列教程按照如下节奏系统地,循序渐进地,难度平滑提高地展开 在使用S ...

  2. Shiro 入门笔记,整合SpringBoot,Redis

    Shiro 入门笔记 视频地址:https://www.bilibili.com/video/BV1uz4y197Zm 感谢编程不良人的教程 1. 权限管理 权限管理包括用户 身份认证 和 授权 两部 ...

  3. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  4. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  5. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  6. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  7. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  8. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  9. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  10. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

最新文章

  1. sshd_config中文手册2
  2. Linux中修改weblogic默认IP,Weblogic 12c ip 地址改变如何配置
  3. 简单的机器学习程序_人体动作识别小程序【机器学习 人工智能】
  4. python3 image_python3 ImageTk 安装方法
  5. linux df -h指令,Linux df 命令使用参数详解
  6. 列表转化成数组_30. 把数组排成最小的数
  7. 写一条SQL,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。...
  8. python的类方法、静态方法、实例方法_Python 类方法、实例方法、静态方法
  9. CocosCreator中TiledMap简单使用
  10. dedecms采集侠问题
  11. 同样取整,TRUNC函数与INT函数的有什么区别?
  12. foxmail远程主机强迫关闭了一个现有的连接
  13. 什么运动耳机好用,六款运动耳机值得推荐
  14. C# .NET 解决提示“由于应用程序配置不正确,应用程序未能启动..”的错误
  15. 计算机类sci四大水刊,材料灌水的sci期刊_十大水榜sci杂志_四大垃圾sci杂志
  16. java app 图标_App 更换应用图标
  17. 防苹果小米日期时间控件
  18. 差分S参数 转 单端S参数 的推导
  19. 关于CIFAR-10图像分类总结
  20. 义乌给力电子商务有限公司诚聘高级淘宝网店运营专员(2名)长期有效

热门文章

  1. 【MATLAB】从文件读取:xlsread、load
  2. 计算机汇编语言调试报告心得,汇编语言实习心得
  3. javascript怎么对url进行编码转换
  4. python compare_ssim_Python 之 计算psnr和ssim值
  5. 利用UDP端口转发绕过校园网认证
  6. 【贪心算法】哈夫曼编码问题
  7. python经纬度是否在范围内_如何用经纬度数据在python里查询城市等地址信息
  8. c语言驾校信息管理系统,驾校综合信息管理系统下载_驾校综合信息管理系统v1.1免费版-这家软件站...
  9. Dijkstra算法结合时间窗规划无冲突路径
  10. 使用SAXReader所需jar包