http://blog.csdn.net/facekbook/article/details/54910606

本文介绍

  • 授权流程
  • 授权方式
  • 授权测试
  • 自定义授权realm

授权流程

开始构造SecurityManager环境subject.isPermitted()授权securityManager.isPermitted()执行授权Authorizer执行授权Realm根据身份获取资源权限信息结束

授权方式

Shiro支持三种方式的授权:

  • 编程式:通过写if/else授权代码块完成。
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
}else{
//没有权限 }
  • 注解式:通过在执行的Java方法上放置相应的注解完成。
@RequiresRole("admin")
public void hell(){ //有权限 }
  • JSP标签:在Jsp页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!--有权限--> </shiro:hasRole>

授权测试

创建ini配置文件

在classpath路径下创建shiro-permission.ini文件,内容如下:

[users]
#用户zhangsan的密码是123,此用户具有role1和role2两个角色
zhangsan=123,role1,role2
lisi=123,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

测试代码

    @Testpublic void testPermission() {// 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini"); // 通过工厂创建SecurityManager SecurityManager securityManager = factory.getInstance(); // 将SecurityManager设置到运行环境中 SecurityUtils.setSecurityManager(securityManager); //创建一个Subject实例,该实例认证需要使用上面创建的SecurityManager Subject subject = SecurityUtils.getSubject(); //创建token令牌,账号和密码是ini文件中配置的 //AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123");//账号密码正确token 角色是 role1,role2 AuthenticationToken token = new UsernamePasswordToken("lisi", "123");//lisi账号的token 角色是role3 /** * role1=user:create,user:update role2=user:create,user.delete role3=user:create */ try { //用户登录 subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } //用户认证状态 Boolean isAuthenticated = subject.isAuthenticated(); System.out.println("用户认证状态:"+isAuthenticated);//输出true //用户授权检测 //是否拥有一个角色 System.out.println("是否拥有一个角色:"+subject.hasRole("role1")); //是否拥有多个角色 System.out.println("是否拥有多个角色:"+subject.hasAllRoles(Arrays.asList("role1","role2"))); //检测权限 try { subject.checkPermission("user:create"); } catch (AuthorizationException e) { e.printStackTrace(); } try { subject.checkPermissions("user:create","user.delete"); } catch (AuthorizationException e) { e.printStackTrace(); } }

基于角色的授权

//是否拥有一个角色
System.out.println("是否拥有一个角色:"+subject.hasRole("role1"));
//是否拥有多个角色
System.out.println("是否拥有多个角色:"+subject.hasAllRoles(Arrays.asList("role1","role2")));

对应的check方法:

subject.checkRole("role1");
subject.checkRoles(Arrays.asList("role1","role2"));

上边check方法如果授权失败则抛出异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have role [.....]

基于资源授权

System.out.println("是否拥有某个权限:"+subject.isPermitted("user:create"));
System.out.println("是否拥有多个权限:"+subject.isPermittedAll("user:create","user.delete"));

对应的check方法:

subject.checkPermission("user:create");
subject.checkPermissions("user:create","user.delete");

上边check方法如果授权失败则抛出异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [....]

自定义realm

在shiro认证那篇博客中编写的自定义realm类中有一个doGetAuthorizationInfo 方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权。

realm代码

/**
* 授权方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//后去身份信息,这个字段就是前面的username String username = (String)principals.getPrimaryPrincipal(); //模拟通过身份信息获取所有权限 List<String> permissions = new ArrayList<>(); permissions.add("user:create"); permissions.add("user:delete"); //将权限信息封装到AuthorizationInfo中,并返回 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.addStringPermissions(permissions); return authorizationInfo; }

shiro-realm.ini文件

需要使用这个配置文件。

测试代码

同上边的授权测试代码,注意修改ini地址为shiro-realm.ini。

授权执行流程

1、 执行subject.isPermitted(“user:create”) 
2、 securityManager通过ModularRealmAuthorizer进行授权 
3、 ModularRealmAuthorizer调用realm获取权限信息 
4、 ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配

该文章涉及的代码

代码地址

转载于:https://www.cnblogs.com/telwanggs/p/7118129.html

(转)shiro权限框架详解05-shiro授权相关推荐

  1. (转) shiro权限框架详解06-shiro与web项目整合(上)

    http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...

  2. (转)shiro权限框架详解03-shiro介绍

    http://blog.csdn.net/facekbook/article/details/54893740 shiro介绍 本文正式进入主题.本文将介绍如下内容: 什么是shiro 为什么需要学习 ...

  3. (转)shiro权限框架详解02-权限理论介绍

    http://blog.csdn.net/facekbook/article/details/54893042 权限管理解决方案 本文主要介绍权限管理的解决方法: 粗颗粒度和细颗粒度 基于url拦截 ...

  4. (转)shiro权限框架详解06-shiro与web项目整合(下)

    http://blog.csdn.net/facekbook/article/details/54962975 shiro和web项目整合,实现类似真实项目的应用 web项目中认证 web项目中授权 ...

  5. shiro权限框架详解02-权限理论介绍

    权限管理解决方案 本文主要介绍权限管理的解决方法: 粗颗粒度和细颗粒度 基于url拦截 使用权限管理框架 粗颗粒度和细颗粒度 什么是粗颗粒度和细颗粒度 在上一文中提到粗颗粒度和细颗粒度,但是没有细讲. ...

  6. (转) shiro权限框架详解04-shiro认证

    http://blog.csdn.net/facekbook/article/details/54906635 shiro认证 本文介绍shiro的认证功能 认证流程 入门程序(用户登录和退出) 自定 ...

  7. (转)shiro权限框架详解01-权限理论介绍

    http://blog.csdn.net/facekbook/article/details/54890365 权限管理 本文介绍权限管理的理论和权限管理的一些名词. 介绍权限管理 理解身份认证和授权 ...

  8. Shiro权限管理详解(授权和注解开发)【面试点】

    Shiro权限管理详解 1. 权限管理 1.1什么是权限管理 1.2用户身份认证 1.2.1 概念 1.2.2 用户名密码身份认证流程 1.2.3 关键对象 1.3 授权 1.3.1 概念 1.3.2 ...

  9. Shiro权限管理框架详解

    1权限管理1.1什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权 ...

最新文章

  1. android-sqlite小实例
  2. rust python扩展_Rust语言优化Python性能案例
  3. 8.2.5: Spring3.0新增的@DependsOn和@Lazy
  4. AngularJS特性
  5. 虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎
  6. 用vue实现简单实时汇率计算功能
  7. 拿什么拯救Web时代的安全危机
  8. NYOJ1282部分和问题--DFS剪枝入门
  9. 网易云android国内版,网易云音乐Android版产品体验报告
  10. 微信小程序测试二维码跳转链接
  11. 图书条形码跟ISBN号互相转换的类
  12. python利用四个坐标点对图片目标区域最小外接矩形进行裁剪
  13. 上古卷轴5:天际(重制版)关于寒霜之秋(frostfall)保暖度与覆盖度为0的解决办法
  14. Detection with Enriched Semantics(DES)算法笔记
  15. iOS进阶 - 包大小:如何从资源和代码层面实现全方位瘦身
  16. 【毕业设计】基于单片机的手势检测识别系统 - arduino 物联网嵌入式
  17. u-boot移植篇——了解u-boot
  18. 关于上位机和下位机的一些解释
  19. 数字图像处理(冈萨雷斯)学习 第3章 灰度变换与空间滤波
  20. Christian band介绍

热门文章

  1. 理解云原生--开发模型、架构原则、主要技术
  2. scala基础之泛型详解
  3. (21)FPGA面试技能提升篇(JESD204B接口)
  4. 1014.QxORM移植
  5. Mavlink 协议硬解析主要代码
  6. Nginx基本数据结构之ngx_pool_t
  7. s3c6410 ddr初始化
  8. 带你一文看懂MySqL中的事务与索引
  9. linux server 5.5下载地址,《红帽Linux 5.5 for x86 服务器版》(RedHat Enterprise Linux Server 5.5 for x86)...
  10. 查看mysql某人执行了什么语句_详解MySQL如何监控系统全部执行过的sql语句