(2)shiro角色资源权限
一般在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角色资源权限相关推荐
- Shiro角色和权限管理
Shiro角色和权限管理 在resources下创建shiro.ini文件,用于存储数据,也可以将数据存于数据库,这里我采用shiro.ini文件,内容如下: [users] zhangsan=z3, ...
- shiro 角色与权限的解读
1.为什么 shiro 有了<角色>后,还要设置<角色权限>呢?(问题) 思考:设置好角色了,那么就代表什么操作都可以执行了吗? 理解:如果上边回答是的话,那么只是<角色 ...
- 走火入魔.NET权限组件-用资源权限(设置权限)思想来解来解决权限的存储问题...
一个软件并不是B/S的就牛了,或者是C/S的就怎么了,软件的主要目的是为了达到用户的什么目的?QQ为啥不做个B/S的?VS系列为啥不做个B/S的?SAP为啥不做个B/S的?操作系统为啥不作个B/S的? ...
- 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统
一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...
- spring boot shiro redis整合基于角色和权限的安全管理-Java编程
一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...
- Shiro基础应用——角色和权限校验
一.Shiro 为什么要用shiro: 1.项目中的密码是否可以明文存储? 2.是否任意访客,无论是否登录都可以访问任何功能? 3.项目中的各种功能操作,是否是所有用户都可以随意使用? 综上,当项目中 ...
- RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣
RBAC.控制权限设计.权限表设计 基于角色权限控制和基于资源权限控制的区别优劣 一.介绍 二.基于角色的权限设计 三.基于资源的权限设计 四.主体.资源.权限关系图 主体.资源.权限相关的数据模型 ...
- shiro安全框架扩展教程--如何扩展realm桥接器并退出自动清空角色资源缓存
上一章节我们知道了如何扩展自己的缓存机制,下面我们就学习下如何应用自己的自定义缓存,我们登录都必须要写一个realm,就是所谓的桥接器; 鉴于我们登录都会把拥有的角色放到缓存,这样都不用每次请求都要访 ...
- 企业权限管理系统之角色操作资源权限管理(八)
文章目录 (一)角色操作:查询所有角色(流程分析) (二)角色操作:查询所有角色(代码实现) (三)角色操作:添加角色(流程分析) (四)角色操作:添加角色(代码实现) (五)角色操作:角色详情查询 ...
最新文章
- PicoBlaze输入/输出端口
- redis php 持久化,详解Redis RDB持久化、AOF持久化,
- python去除数组缺失值_动态数组的应用,VBA中如何利用动态数组去除重复值的第二讲...
- lambda 和 std::function
- MATLAB 批量改文件名称
- Docker学习笔记 - Docker容器的日志
- 国家机构评测主流电视:长虹人工智能语音识别第一
- cvCompareHist() 直方图匹配
- 前端基础语言HTML、CSS 和 JavaScript 学习指南
- 通达信、东方财富神奇九转指标计算公式,代码实现
- 苹果6s最大屏幕尺寸_苹果 iPhone 12 Pro DXOMARK 屏幕评分 87 分,最大问题是黄色色偏 - 苹果,iPhone...
- debian之网易云音乐的安装
- 什么是递归查询,迭代查询?
- Linux如何新建用户
- 算法题Nuts and Bolts(螺母螺钉)快速排序详细讲解(含流程图)
- 垃圾填埋场渗滤液厌氧处理过程中沼气的综合利用
- 论文阅读+实战:SimGNN:A Neural Network Approach to Fast Graph Similarity Computation
- Unity学习笔记--怎么打断当前动画并且重新播放当前动画(超简单一步实现版)
- Solidworks鼠标功能和常用快捷键
- finecmsV5.0.8 \finecms\dayrui\controllers\Api.php getshell