一般在web系统权限设计中,一般分为三个维度,用户,角色,资源,一个用户可以拥有多个角色,比如说可以是老师,也可以是班主任,一个角色也可以拥有多个资源。

比如老师同时拥有查看班级学生和批改作业的资源,如果一个用户有老师这个角色,那么就代表他拥有了查看班级学生和批改作业的两个资源权限。

因为只判断角色颗粒度太粗,而根据资源权限则比较细。

校验权限代码

在classpath下新建shiro-role.ini文件,内容如下:

代表有一个zhang的用户,拥有role1角色(如果有多个角色,后面用逗号继续隔开role1,role2)

role1这个角色有两个资源,分别是user:create和user:update。

[users]
zhang=123456,role1
[roles]
role1=user:create,user:update

测试代码:

        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-role.ini");//得到安全管理器SecurityManager securityManager = factory.getInstance();//将securityManager托管给SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123456");try {subject.login(token);} catch (AuthenticationException e) {e.printStackTrace();}//是否已经认证
        System.out.println(subject.isAuthenticated());//校验是否有对应的权限和资源,如果没有则抛出对应的异常UnauthorizedExceptionsubject.checkRole("role1");subject.checkPermission("user:create");//退出subject.logout();

过程没有遇到任何错误,执行到了最后,但是如果你check一个zhang不存在的role或者permission,则会报UnauthorizedException。

身份和凭证

在登陆中,用户需要提供principals(身份)和credentials(证明/凭证)提供给shiro来进行认证和授权。

principals可以有多个身份,但是只能有一个Primary principals,一般是登录账号,比如手机号。

credentials一般是密码。

在UsernamePasswordToken的账户密码就对应着身份和凭证。

subject.login()原理

当执行subject.login的时候,实际调用的是securityManager所属的Authenticator(默认是ModularRealmAuthenticator)的doAuthenticate方法进行验证。

他会根据当前设置了几个realm走不同的方法(后面介绍多个realms)

最终走的realm对应的getAuthenticationInfo方法,判断用户账号密码是否正确,如果错误则抛出对应的异常。正确则返回一个AuthenticationInfo对象。(这里是SimpleAuthenticationInfo)

所以后面我们自定义realms的时候就覆盖getAuthenticationInfo这个方法即可。

subject.checkRole原理

当用户调用subject.checkRole("role1")判断用户是否有对应的角色的时候,底层还是走的SecurityManager所属的Authorizer的checkRole方法。

hasRole然后又走了下面的方法

最后获取到了所有的realms,上篇文章说了java环境下使用了IniRealm,并且注入到了Authenticator(认证器)和Authorizer(授权器)的一个成员变量中。

所以getRealms就可以直接获取到所有的realms

因为IniRealms继承了AuthorizingRealm,而IniRealm没有实现hasRole方法,所以会走他的继承类AuthorizingRealm里面的hasRole来判断是否有权限。下面就是对应的方法。

在初始化IniRealm的时候会读取所有用户所属的role和permission并封装到成员变量中,getAuthorizationInfo方法就是返回了一个AuthorizationInfo对象里面获取了zhang所属role和permission。

所以我们自定义realm进行授权的时候就是覆盖了realm的getAuthorizationInfo方法,里面封装的role和permission都是从数据库查询出来的。

最后进行checkRole就很容易看懂了。

如果返回false,则Authorizer会抛出UnauthorizedException授权失败异常。

github地址

https://github.com/cmniefei/shiroparent

转载于:https://www.cnblogs.com/nfcm/p/9875657.html

(2)shiro角色资源权限相关推荐

  1. Shiro角色和权限管理

    Shiro角色和权限管理 在resources下创建shiro.ini文件,用于存储数据,也可以将数据存于数据库,这里我采用shiro.ini文件,内容如下: [users] zhangsan=z3, ...

  2. shiro 角色与权限的解读

    1.为什么 shiro 有了<角色>后,还要设置<角色权限>呢?(问题) 思考:设置好角色了,那么就代表什么操作都可以执行了吗? 理解:如果上边回答是的话,那么只是<角色 ...

  3. 走火入魔.NET权限组件-用资源权限(设置权限)思想来解来解决权限的存储问题...

    一个软件并不是B/S的就牛了,或者是C/S的就怎么了,软件的主要目的是为了达到用户的什么目的?QQ为啥不做个B/S的?VS系列为啥不做个B/S的?SAP为啥不做个B/S的?操作系统为啥不作个B/S的? ...

  4. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  5. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  6. Shiro基础应用——角色和权限校验

    一.Shiro 为什么要用shiro: 1.项目中的密码是否可以明文存储? 2.是否任意访客,无论是否登录都可以访问任何功能? 3.项目中的各种功能操作,是否是所有用户都可以随意使用? 综上,当项目中 ...

  7. RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣

    RBAC.控制权限设计.权限表设计 基于角色权限控制和基于资源权限控制的区别优劣 一.介绍 二.基于角色的权限设计 三.基于资源的权限设计 四.主体.资源.权限关系图 主体.资源.权限相关的数据模型 ...

  8. shiro安全框架扩展教程--如何扩展realm桥接器并退出自动清空角色资源缓存

    上一章节我们知道了如何扩展自己的缓存机制,下面我们就学习下如何应用自己的自定义缓存,我们登录都必须要写一个realm,就是所谓的桥接器; 鉴于我们登录都会把拥有的角色放到缓存,这样都不用每次请求都要访 ...

  9. 企业权限管理系统之角色操作资源权限管理(八)

    文章目录 (一)角色操作:查询所有角色(流程分析) (二)角色操作:查询所有角色(代码实现) (三)角色操作:添加角色(流程分析) (四)角色操作:添加角色(代码实现) (五)角色操作:角色详情查询 ...

最新文章

  1. PicoBlaze输入/输出端口
  2. redis php 持久化,详解Redis RDB持久化、AOF持久化,
  3. python去除数组缺失值_动态数组的应用,VBA中如何利用动态数组去除重复值的第二讲...
  4. lambda 和 std::function
  5. MATLAB 批量改文件名称
  6. Docker学习笔记 - Docker容器的日志
  7. 国家机构评测主流电视:长虹人工智能语音识别第一
  8. cvCompareHist() 直方图匹配
  9. 前端基础语言HTML、CSS 和 JavaScript 学习指南
  10. 通达信、东方财富神奇九转指标计算公式,代码实现
  11. 苹果6s最大屏幕尺寸_苹果 iPhone 12 Pro DXOMARK 屏幕评分 87 分,最大问题是黄色色偏 - 苹果,iPhone...
  12. debian之网易云音乐的安装
  13. 什么是递归查询,迭代查询?
  14. Linux如何新建用户
  15. 算法题Nuts and Bolts(螺母螺钉)快速排序详细讲解(含流程图)
  16. 垃圾填埋场渗滤液厌氧处理过程中沼气的综合利用
  17. 论文阅读+实战:SimGNN:A Neural Network Approach to Fast Graph Similarity Computation
  18. Unity学习笔记--怎么打断当前动画并且重新播放当前动画(超简单一步实现版)
  19. Solidworks鼠标功能和常用快捷键
  20. finecmsV5.0.8 \finecms\dayrui\controllers\Api.php getshell

热门文章

  1. linux中I/O设备分为两类:字符设备和块设备。
  2. C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?
  3. jsp:请求转发和重定向
  4. 人人都是 DBA(V)SQL Server 数据库文件
  5. Excel中的的经纬度坐标在地图上显示
  6. Loadrunner在post请求的cookie中插入其它多个值
  7. S2SH整合所需jar包及其详解
  8. Spring NamedParameterJdbcTemplate 详解
  9. Modern CSV中文版
  10. iOS----------苹果警告