//首先这里是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. matlab使用

    1.nargin 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数. 2.assert “断言”,“坚持自己的主张”.判断函数. http://www.cnb ...

  2. 使用POSIX正则库匹配一行中多个结果

    正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...

  3. cdh5.7权限测试示例

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本文旨在展示CDH基于Kerberos身份认证和基于Sentry的权限控制功能的测试示例. 1. 准备测试数据 cat / ...

  4. flume+kafka+smart数据接入实施手册

    1.  概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.   整体方案 Flume作为日志收集工具,监控一个文件目录或者一 ...

  5. notifyDataSetInvalidated()跟notifyDataSetChanged()的区别

    public void notifyDataSetChanged(): 通过一个外部的方法控制,如果适配器的内容改变了,那么就会强制调用getView来刷新每个Item的内容.这个方法内部实现了在每个 ...

  6. thinkphp 内置标签volist 控制换行

    thinkphp 内置标签volist 控制换行 volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行 ...

  7. 《C与指针》第七章练习

    本章问题 1.具有空函数体的函数可以作为存根使用,你如何对这类函数进行修改,使其更有用? answer:Have the stub(存根) print out a message when it is ...

  8. java 泛型接口示例

    /* * 泛型接口 */ interface Tool<t> { public void show(T t); //泛型方法 public <e> void print(E e ...

  9. AndroidImagePicker 的使用

    github地址 https://github.com/easonline/AndroidImagePicker 效果图

  10. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...