shiro-身份授权流程、案例

一、身份授权流程

  1. 首先调用Subject.isPermitted/hasRole接口,委托给SecurityManager.
  2. SecurityManager接着会委托给内部组件Authorizer.
  3. Authorizer再将其请求委托给我们的Realm去做,Realm才是真正干活的.
  4. realm将用户请求的参数封装成权限对象,再从我们重写的doGetAuthorizationInfo方法中获取从数据库中查询到的权限集合.
  5. Realm将用户传入的权限对象,与数据库查询出来的权限对象进行比较。如果用户掺入的权限对象在数据库中存在,侧返回true,否则返回false。
    前提:进行授权操作的前提,用户必须通过认证。

二、案例

1.首先模拟数据库查询数据
 /*** 通过用户名查询角色列表* @param loginName* @return*/List<String> findRoleByLoginName(String loginName);/*** 通过用户名查询资源列表* @param loginName* @return*/List<String> findPermissionByLoginName(String loginName);
/*** 通过用户名查询角色列表* 伪代码* @param loginName* @return*/@Overridepublic List<String> findRoleByLoginName(String loginName) {List<String> list = Lists.newArrayList();list.add("admin");list.add("dev");return list;}/*** 通过用户名查询资源列表* 伪代码* @param loginName* @return*/@Overridepublic List<String> findPermissionByLoginName(String loginName) {List<String> list = Lists.newArrayList();list.add("order.add");list.add("order.insert");list.add("order.delete");return list;}
2.编写授权,认证的代码在之前的文章里
/*** 鉴权* @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {//一、拿到用户凭证String loginName = (String)principalCollection.getPrimaryPrincipal();//二、从数据库中查询对应的角色和权限SecurityServiceImpl service = new SecurityServiceImpl();List<String> roles = service.findRoleByLoginName(loginName);List<String> permissions = service.findPermissionByLoginName(loginName);//三、构建资源校验对象SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();simpleAuthorizationInfo.addRoles(roles);simpleAuthorizationInfo.addStringPermissions(permissions);return simpleAuthorizationInfo;}
         //导入ini配置创建工厂IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");//工厂构建安全管理器SecurityManager securityManager = factory.getInstance();//使用工具生效安全管理器SecurityUtils.setSecurityManager(securityManager);//使用工具获取subject的主体Subject subject = SecurityUtils.getSubject();//构建账号密码UsernamePasswordToken passwordToken = new UsernamePasswordToken("zhangSan", "123");//使用subject主体去登录subject.login(passwordToken);//打印登录信息System.out.println("登录结果" + subject.isAuthenticated());//校验当前用户是否拥有管理员的权限boolean admin = subject.hasRole("admin");System.out.println("是否用户管理员角色"+admin);//校验当前用户没有的角色try {subject.checkRole("coder");System.out.println("当前用户有coder这个角色");} catch (AuthorizationException e) {System.out.println("当前用户没有coder这个角色");}//校验当前用户的权限信息System.out.println("当前用户是否有查看订单的权限"+ subject.isPermitted("order:list"));//校验当前用户没有的权限try {subject.checkPermission("order:update");System.out.println("当前用户有修改权限");} catch (AuthorizationException e) {System.out.println("当前用户没有修改权限");}
执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对Java的URL类支持的协议进行扩展的方法

转载自 对Java的URL类支持的协议进行扩展的方法JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时&#xff0c;主要会涉及到如下几个类&#xff1a;java.net.URL、java.net.URLConnection、InputStream。URL类默认…

在.Net项目中使用Redis作为缓存服务

最近由于项目需要&#xff0c;在系统缓存服务部分上了redis&#xff0c;终于有机会在实际开发中玩一下&#xff0c;之前都是自己随便看看写写&#xff0c;很零碎也没沉淀下来什么&#xff0c;这次算是一个系统学习和实践过程的总结。 和Redis有关的基础知识 Redis是一个开源的分…

中国的程序员培训是不是有问题?

内容来源于&#xff0c;看最下面的出处&#xff0c;侵删 中国技术开放日的出海团对日本进行了为期一周的访问。笔者随行了头两天&#xff0c;参加Slush Asia大会&#xff0c;并访问了Gungho和Deloitte两家企业。虽然已经在日本生活了四年&#xff0c;但这样的体验却甚少&#x…

后台回调支付宝

https://blog.csdn.net/u012552275/article/details/78320051 网上找了一个可以起吊支付宝的appdemo &#xff0c;它集成了服务器端&#xff0c;我先将其分离为app和服务器端&#xff0c;保证app在接收参数后可以启调支付宝 &#xff08;保证app这边是正确的 不然出错都不知道…

解决高版本SpringBoot整合swagger时启动报错:Failed to start bean ‘documentationPluginsBootstrapper‘ 问题

一、控制台的报错信息 2021-12-29 15:15:04 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is j…

java图片格式转化(例如jpg格式转化png)

转载自 java图片格式转化&#xff08;例如jpg格式转化png&#xff09; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Scanner;import javax.imageio.*; public class FormatConversion {public static final Str…

微软开源PowerShell并支持Linux

建议在Wifi 环境下观看视频 class"video_iframe" data-vidtype"1" style" z-index:1; " height"375" width"500" frameborder"0" data-src"https://v.qq.com/iframe/preview.html?vidv0322g7kd3f&width…

招银网络科技笔试

记录一下 招银网络笔试 2017年09月11日 14:32:53 阅读数&#xff1a;2450 Part1. 30道单选 涉及Java&#xff0c;C&#xff0c;多线程&#xff0c;算法&#xff0c;数据结构&#xff0c;CPU&#xff0c;NP问题&#xff0c;SQL语句&#xff0c;IP地址转换&#xff0c;行测。…

mybatisGenerator逆向工程

一、在pom文件中导入依赖和generator插件 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency&…

2016最佳温情小说:雨还在下....

作者 | 李德霞 来源 | 小小说选刊 哗&#xff0c;一道闪电&#xff1b;轰&#xff0c;一个响雷。 暴雨倾盆&#xff0c;天地间浑沌一片…… 老大扑腾腾坐起来&#xff0c;心也跟着扑腾腾地跳。老大拉亮灯&#xff0c;推推身边的媳妇。媳妇一骨碌爬起来&#xff0c;咋&#xf…

java 中 image 和 byte[] 相互转换

转载自 java 中 image 和 byte[] 相互转换只需要一个存储了图片信息的二进制串&#xff08;byte[]&#xff09; 然后&#xff0c;这样&#xff1a; InputStream buffin new ByteArrayInputStream(/*二进制串*/, /*起始位置*/,/*二进制串长度*/)); BufferedImage img ImageIO…

招银网络

记录一下 招银网络笔试 2017年09月11日 14:32:53 阅读数&#xff1a;2451 Part1. 30道单选 涉及Java&#xff0c;C&#xff0c;多线程&#xff0c;算法&#xff0c;数据结构&#xff0c;CPU&#xff0c;NP问题&#xff0c;SQL语句&#xff0c;IP地址转换&#xff0c;行测。…

Java 文件和byte数组转换

转载自 Java 文件和byte数组转换 /** * 获得指定文件的byte数组 */ private byte[] getBytes(String filePath){ byte[] buffer null; try { File file new File(filePath); FileInputStream fis new FileInputStream(file); ByteArrayOutputStream bos new ByteAr…

json大文件导入数据库

json文件导入数据库 使用Navicat的客户端工具也可以实现json文件导入数据库&#xff0c;但是数据量大了之后&#xff0c;字段的值过于冗长可能会导致数据的截取&#xff0c;是的数据导入不是完整的。 所以另辟蹊径使用其他方法 创建一个新的工程用原始的jdbc实现数据的导入 一…

Docker for Windows使用简介

在上一篇文章中&#xff0c;通过演练指导的方式&#xff0c;介绍了在Docker中运行ASP.NET Core Web API应用程序的过程。本文将介绍Docker for Windows的使用。 先决条件 前两周时间&#xff0c;Docker发布了Docker for Windows的正式版&#xff0c;于是就可以在Windows下运行D…

pagehelper 不分页的解决方法

pagehelper 不分页的解 pagehelper PageHelper.startPage(1, 10);只对该语句以后的第一个查询语句得到的数据进行分页, 就算你在PageInfo pa new PageInfo("",对象);语句里面的对象是写的最终得到的数据,该插件还是只会对第一个查询所查询出来的数据进行分页 第一…

最近流行的12个笑话,好笑又有道理

来源 | 悦读文摘&#xff08;ID&#xff1a;yueduwz&#xff09; 01 一个盲人到亲戚家做客&#xff0c;天黑后&#xff0c;他的亲戚好心为他点了个灯笼&#xff0c;说&#xff1a;“天晚了&#xff0c;路黑&#xff0c;你打个灯笼回家吧&#xff01;” 盲人火冒三丈地说&#x…

java 从jar包中读取资源文件

转载自 java 从jar包中读取资源文件 在代码中读取一些资源文件(比如图片&#xff0c;音乐&#xff0c;文本等等)&#xff0c;在集成环境(Eclipse)中运行的时候没有问题。但当打包成一个可执行的jar包&#xff08;将资源文件一并打包&#xff09;以后&#xff0c;这些资源文件找…

json常用的转换

一、json字符串与map的相互转换 首先要导入依赖&#xff0c;用的是fastjson依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.45</version> </dependency>json转map //第一…

JWT【JSON Web Token】 简述

JWT全称JSON Web Token[http://www.jwt.io/]&#xff0c;用于发送可通过数字签名和认证的东西&#xff0c;它包含一个紧凑的&#xff0c;URL安全的JSON对象&#xff0c;服务端可通过解析该值来验证是否有操作权限&#xff0c;是否过期等安全性检查。由于其紧凑的特点&#xff0…