//首先这里是java代码,就是根据shiro-role.ini配置文件中的信息来得到role与用户信息的对应关系
//从而来管理role
public class TestShiroRoleTest extends Test2{
@Test
public void testHasRole(){
login("classpath:shiro-role.ini","zhang","123");
//判断拥有角色role1
Assert.assertTrue(SecurityUtils.getSubject().hasRole("role1"));
//判断拥有角色role1 and role2 对这里是否含有所有role进行判断
Assert.assertTrue(SecurityUtils.getSubject().hasAllRoles(Arrays.asList("role1","role2")));
//判断拥有角色role1 and role2 and role3 分别对是否含有这里的每一个role进行判断
boolean[] result = SecurityUtils.getSubject().hasRoles(Arrays.asList("role1","role2","role3"));
Assert.assertTrue(result[0]);
Assert.assertTrue(result[1]);
Assert.assertTrue(result[2]);
}
}

shiro-role.ini配置文件中的内容如下所示

然后是Test2的文件中,封装了用户登录和注销时的一些释放工作

public abstract class Test2 {
@After
public void tearDown() throws Exception{
ThreadContext.unbindSubject();//退出时请解除绑定Subject从当前线程中解绑Subject
} protected void login(String configFile,String username,String password){
//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory<org.apache.shiro.mgt.SecurityManager> factory=
new IniSecurityManagerFactory(configFile); //2、得到SecurityManager实例,并绑定给SecurityUtils
org.apache.shiro.mgt.SecurityManager securityManager=factory.getInstance();
SecurityUtils.setSecurityManager(securityManager); //3、得到Subject
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
}
}

2、Shiro提供了hasRole/hasRole用于判断用户是否拥有某个角色/某些权限;但是没有提供如hashAnyRole用于判断是否有某些权限中的某一个。

在断言其有异常抛出的时候,验证是成功的

Shiro提供了hasRole/hasRole用于判断用户是否拥有某个角色/某些权限;但是没有提供如hashAnyRole用于判断是否有某些权限中的某一个。

@Test(expected = UnauthorizedException.class)
public void testCheckRole(){
login("classpath:shiro-role.ini","zhang","123");
//断言拥有角色:role1
SecurityUtils.getSubject().checkRole("role1");
//断言拥有角色:role1 and role3 失败抛出 异常
SecurityUtils.getSubject().checkRoles("role1","role3");
}

    Shiro提供的checkRole/checkRoles和hasRole/hasAllRoles不同的地方是它在判断为假的情况下会抛出UnauthorizedException异常。

  到此基于角色的访问控制(即隐式角色)就完成了,这种方式的缺点就是如果很多地方进行了角色判断,但是有一天不需要了那么就需要修改相应代码把所有相关的地方进行删除;这就是粗粒度造成的问题。

3、基于资源的访问控制(显示角色)

@Test
public void testIsPermitted(){
login("classpath:shiro-permission.ini","zhang","123");
//判断拥有权限:user:create
Assert.assertTrue(SecurityUtils.getSubject().isPermitted("user:create"));
//判断拥有权限:usesr:update and user:delete同时拥有两个权限才返回true
Assert.assertTrue(SecurityUtils.getSubject().isPermittedAll("user:create","user:update"));
//判断没有权限:user:view
Assert.assertFalse(SecurityUtils.getSubject().isPermitted("user:view"));
}

  Shiro提供了isPermitted和isPermittedAll用于判断用户是否拥有某个权限或所有权限,也没有提供如isPermittedAny用于判断拥有某一个权限的接口。

上边这个方法据测试居然不好用,第一个就报错,真是很奇怪

@Test
public void testCheckPermission(){
login("classpath:shiro-permission.ini","zhang","123");
//断言拥有权限:user:create
SecurityUtils.getSubject().checkPermission("user:create");
//断言拥有权限:user:delete and user:update
SecurityUtils.getSubject().checkPermissions("user:delete","user:update");
//断言拥有权限:user:view失败抛出异常
SecurityUtils.getSubject().checkPermission("user:view");
}

但是失败的情况下会抛出UnauthorizedException异常。

到此基于资源的访问控制(显示角色)就完成了,也可以叫基于权限的访问控制,这种方式的一般规则是“资源标识符:操作”,即是资源级别的粒度;这种方式的好处就是如果要修改基本都是一个资源级别的修改,不会对其他模块代码产生影响,粒度小。但是实现起来可能稍微复杂点,需要维护“用户——角色,角色——权限(资源:操作)”之间的关系。

34、Shiro框架入门三,角色管理的更多相关文章

  1. 32、shiro 框架入门三

    1.AuthenticationStrategy实现 //在所有Realm验证之前调用 AuthenticationInfo beforeAllAttempts( Collection<? ex ...

  2. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  3. 30、shiro框架入门2,关于Realm

    1.Jdbc的Realm链接,并且获取权限 首先创建shiro-jdbc.ini的配置文件,主要配置链接数据库的信息 配置文件中的内容如下所示 1.变量名=全限定类名会自动创建一个类实例 2.变量名. ...

  4. 29、shiro框架入门

    1.建立测试shiro框架的项目,首先建立的项目结构如下图所示 ini文件 中的内容如下图所示 pom.xml文件中的内容如下所示 <project xmlns="http://mav ...

  5. 32、shiro框架入门3.授权

    一. 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission ...

  6. 使用Spring框架入门三:基于XML配置的AOP的使用

    一.引入Jar包 <!--测试1使用--> <dependency> <groupId>org.springframework</groupId> &l ...

  7. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  8. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  9. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

随机推荐

  1. OpenSSL - 文件和字符MD5加密实现

    OpenSSL安装: 1.github下载最新的OpenSSL:https://github.com/openssl/openssl 2.在linux解压压缩包 3.安装OpenSSL ./confi ...

  2. 常用的 SQL 函数

    SQL 函数 聚合函数(针对数字列): AVG:求平均分  COINT: 计算个数  MAX: 求最大值  MIN: 求最小值  SUM: 求和 数学函数():  ABS:     绝对值  CEIL ...

  3. linux crontab -r 导致no crontab for root的原因及解决方案

    使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u user]-用标准输入替代目前的crontab. crontab-1[use ...

  4. codeForce-589D Boulevard(判断线段是否相交)

    题目大意:n个人.一个区间.每个人都会在某个时间段内按相同的速度(所有人的速度都一样,都是1或-1)在他的区间内从一个端点走到另一个端点(只走一次).问每个人会与几个人碰面. 题目分析:将时间看成一个 ...

  5. Linux 安装 node

    在 Linux 上安装 node,使用 Linux 编译后的版本最佳. 1.进入 node 官网,找到 Linux 版本下载,这里我们右键复制下载地址即可. 2.在 Linux 上,使用命令 curl ...

  6. Ioc正解

    IoC是一种模式 IoC(Inversion of Control)中文译为控制反转,目前Java社群中流行的各种轻量级容器的实现都是以IoC模式作为基础的.控制反转意味着在系统开发过程中,设计的类将 ...

  7. 渴切API参考手册

    渴切:是国内优秀的开源css框架. 渴切是一个开源中文 (X)HTML/CSS 框架 ,它的目的是减少你的css开发时间.它提供一个可靠的css基础去创建你的项目,能够用于网站的快速设计,通过重设和重 ...

  8. wireshark如何抓取别人电脑的数据包

    抓取别人的数据包有几种办法,第一种是你和别人共同使用的那个交换机有镜像端口的功能,这样你就可以把交换机上任意一个人的数据端口做镜像,然后你在镜像端口上插根网线连到你的网卡上,你就可以抓取别人的数据了: ...

  9. iphone field test 源码

    Iphone工程模式读取周围BTS信息的路测程序:包括后台和界面.-iphone field test, used for reading the BTS infomation nearby. 下载地 ...

  10. MySQL下载及安装

    MySQL官网  http://dev.mysql.com/downloads/ Download --> Community --> MySQL Community Server 选择操 ...