shiro授权测试
shiro-permission.ini
创建存放权限的配置文件shiro-permission.ini,如下:
[users]
#用户zhang的密码是1111111,此用户具有role1和role2两个角色
zhang=111111,role1,role2
wang=111111,role2 [roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。
权限字符串规则
权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限:user:create,或user:create:*
用户修改实例001的权限:user:update:001
用户实例001的所有权限:user:*:001
测试代码
测试代码同认证代码,注意ini地址改为shiro-permission.ini,主要学习下边授权的方法,注意:在用户认证通过后执行下边的授权代码。

基于角色的授权
System.out.println("是否拥有role角色:"+subject.hasRole("role1"));
System.out.println("是否拥有role1,role2角色:"+subject.hasAllRoles(Arrays.asList("role1","role2")));
// check是否拥有role角色
subject.checkRole("role1");
subject.checkRoles("role1","role2");
上边check方法如果授权失败则抛出异常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have role [.....]
基于资源权限
//基于资源的授权
System.out.println("是否拥有user:create的权限:"+subject.isPermitted("user:create"));
System.out.println("是否拥有user的多个权限:"+subject.isPermittedAll("user:create","user:update"));//返回true
//查询每个权限结果
boolean[] permitted = subject.isPermitted("user:create","user:update","user:add");
for (boolean b : permitted) {
System.out.println(b);//返回 true,true,false
}
System.out.println("是否拥有user的多个权限:"+permitted.length);//返回3个结果
//check检查权限
subject.checkPermission("user:create");
//check检查全部权限是否都有
subject.checkPermissions("user:create","user:update");
上边check方法如果授权失败则抛出异常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [....]
自定义realm
与上边认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权。
realm代码
在认证章节写的自定义realm类中完善doGetAuthorizationInfo方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权。
查看jdbcRealm中的授权源码 尽心参照

授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//null usernames are invalid
if (principals == null) {
throw new AuthorizationException("PrincipalCollection method argument cannot be null.");
}
//获取认证之后返回的身份信息
String username = (String) getAvailablePrincipal(principals);
// 根据身份信息从数据库中查询权限数据
//....这里使用静态数据模拟
List<String> permissions = new ArrayList<>();
permissions.add("user:create");
permissions.add("user:add"); //将权限信息封闭为AuthorizationInfo
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissions);
return info;
}
测试源码不变
授权执行流程
1、 执行subject.isPermitted("user:create")
2、 securityManager最终通过AuthonrezingRealm进行授权
3、 AuthonrezingRealm调用realm获取权限信息
4、 AuthonrezingRealm再通过permissionResolver解析权限字符串,校验是否匹配

shiro授权测试的更多相关文章
- Java环境下shiro的测试-认证与授权
Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...
- shiro基础学习(三)—shiro授权
一.入门程序 1.授权流程 2.授权的三种方式 (1)编程式: 通过写if/else 授权代码块完成. Subject subject = SecurityUtils.getSubjec ...
- shiro授权
一.shiro-permission.ini shiro-permission.ini里面的内容相当于在数据库 #用户 [users] #用户zhang的密码是123,此用户具有role1和role2 ...
- shiro授权及自定义realm授权(七)
1.授权流程
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
- 三、Shiro授权开发
Shiro 支持三种方式的授权: I. 编程式:通过写if/else 授权代码块完成: Subject subject =SecurityUtils.getSubject(); if(subject. ...
- Shiro授权及注解式开发
目的: shiro授权 shiro注解式开发 Shiro授权 首先设计shiro权限表: 从图中我们也清晰的看出五张表之间的关系 ShiroUserMapper Set<String> g ...
- Apache Shiro 使用手册(三)Shiro 授权
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三 ...
- Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
随机推荐
- 基于Eureka的服务治理
代码地址如下:http://www.demodashi.com/demo/11927.html 一.服务的注册与发现 关系调用说明: 服务生产者启动时,向服务注册中心注册自己提供的服务 服务消费者启动 ...
- 19-matlab知识点复习二
%% function RandDisplayJiong axis off; %关闭坐标轴 %Menubar是菜单条 none就是不显示图上方的菜单条 set(gcf,'menubar','none' ...
- 解决InetAddress.isReachable(timeout)在windows xp始终返回false的bug
笔者最近在做产品,其中一个环节用到ping测试主机是否在线. 开发环境:Windows 7 64bit+JDK1.8 x64 以下是检测主机是否在线,开发环境中测试通过 public static b ...
- distpicker使用记录
今天使用distpicker遇到了一些问题,记录一下. 插件地址 使用说明 需要引入的 js 文件 <script type="text/javascript" src=&q ...
- 10.spring-boot基于角色的权限管理页面实现
10.spring-boot基于角色的权限管理页面实现
- maven学习--1.项目结构及简单使用
1.项目目录结构 MavenProjectRoot(项目根目录) |----src | |----main | | |----java ——存放项目的.ja ...
- tomcat简单使用
下载解压tomcat[root@localhost]# tar zxf apache-tomcat-8.5.4.tar.gz -C /usr/local/tomcat yum自带JDK,注意区别JRE ...
- 2018-2019-2 《网络对抗技术》 EXP0 KALI安装 20165213 Week1
kali安装过程 一.从官网下载kail 下载地址为:https://www.kali.org/downloads/ 选择下图中的kali下载 二.用VMware打开虚拟机 打开VMware,点击打开 ...
- zz-人生感悟
1. 社交感想 首先来看一下聪明人和普通人的区别是什么? 普通人思考问题都是一步一步的来,由A推理出B,B推导到C,再推导出D,最后得出E,然而聪明人却可以由A直接推算到E. 这就像开车,普通人的是手 ...
- HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收.理解.接受 3xx:重定向--要完成请求必须进行 ...