shiro授权

1.1 授权流程

1.2 授权方式

Shiro 支持三种方式的授权:

1、编程式:通过写if/else 授权代码块完成:

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole(“admin”)) {

//有权限

} else {

//无权限

}

2、注解式:通过在执行的Java方法上放置相应的注解完成:

@RequiresRoles("admin")

public void hello() {

//有权限

}

3、 JSP/GSP 标签:在JSP/GSP页面通过相应的标签完成:

<shiro:hasRole name="admin">

<!— 有权限—>

</shiro:hasRole>

本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。

1.3 授权测试

1.3.1 shiro-permission.ini

创建存放权限的配置文件shiro-permission.ini,如下:

[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=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...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

1.3.2 权限字符串规则

权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:

用户创建权限:user:create,或user:create:*

用户修改实例001的权限:user:update:001

用户实例001的所有权限:user:*:001

1.3.3 测试代码

测试代码同认证代码,注意ini地址改为shiro-permission.ini,主要学习下边授权的方法,注意:在用户认证通过后执行下边的授权代码。

@Testpublic void testPermission() {// 从ini文件中创建SecurityManager工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");// 创建SecurityManagerSecurityManager securityManager = factory.getInstance();// 将securityManager设置到运行环境SecurityUtils.setSecurityManager(securityManager);// 创建主体对象Subject subject = SecurityUtils.getSubject();// 对主体对象进行认证// 用户登陆// 设置用户认证的身份(principals)和凭证(credentials)UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");try {subject.login(token);} catch (AuthenticationException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 用户认证状态Boolean isAuthenticated = subject.isAuthenticated();System.out.println("用户认证状态:" + isAuthenticated);// 用户授权检测 基于角色授权// 是否有某一个角色System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));// 是否有多个角色System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));//subject.checkRole("role1");//subject.checkRoles(Arrays.asList("role1", "role2"));// 授权检测,失败则抛出异常// subject.checkRole("role22");// 基于资源授权System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1","user:delete"));//检查权限subject.checkPermission("sys:user:delete");subject.checkPermissions("user:create:1","user:delete");}

1.3.4 基于角色的授权

// 用户授权检测 基于角色授权// 是否有某一个角色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 [.....]

1.3.5 基于资源授权

// 基于资源授权System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1","user:delete"));对应的check方法:subject.checkPermission("sys:user:delete");subject.checkPermissions("user:create:1","user:delete");

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

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

1.4 自定义realm

与上边认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权。

1.4.1 realm代码

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

// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 获取身份信息String username = (String) principals.getPrimaryPrincipal();// 根据身份信息从数据库中查询权限数据//....这里使用静态数据模拟List<String> permissions = new ArrayList<String>();permissions.add("user:create");permissions.add("user.delete");//将权限信息封闭为AuthorizationInfoSimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();for(String permission:permissions){simpleAuthorizationInfo.addStringPermission(permission);}return simpleAuthorizationInfo;}

1.4.2 shiro-realm.ini

ini配置文件还使用认证阶段使用的,不用改变。

1.4.3 测试代码

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

1.4.4 授权执行流程

1、 执行subject.isPermitted("user:create")

2、 securityManager通过ModularRealmAuthorizer进行授权

3、 ModularRealmAuthorizer调用realm获取权限信息

4、ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配

shiro教程(3)-shiro授权相关推荐

  1. Shiro 教程,Shiro教程0.2 下载,Shiro功能修复与升级说明。

    2019独角兽企业重金招聘Python工程师标准>>> Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载? 原文链接:http ...

  2. Shiro教程_2 Shiro+SpringBoot+Mysql+Redis(缓存)

    源代码 https://gitee.com/fakerlove/Shiro Shiro+SpringBoot+Mysql+Redis(缓存) 1. 添加依赖 <?xml version=&quo ...

  3. shiro教程(2)- shiro介绍

    shiro教程系列 shiro教程(3)-shiro授权 1 shiro介绍  1.1 什么是shiro Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身 ...

  4. Shiro 教程_1

    教案 https://gitee.com/fakerlove/Shiro 文章目录 Shiro 教程 1. Shiro 介绍 1.1 什么是 Shiro 1.2 Shiro 好处 1.3 Shiro ...

  5. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)EHCache版本

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

  6. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

  7. Shiro学习笔记_02:shiro的认证+shiro的授权

    Shiro 学习笔记 本文基于B站UP主[编程不良人]视频教程[2020最新版Shiro教程,整合SpringBoot项目实战教程]进行整理记录,仅用于个人学习交流使用. 视频链接:https://w ...

  8. 2017.2.16 开涛shiro教程-第十七章-OAuth2集成(一)服务器端

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第十七章-OAuth2集成 1.OAuth2介 ...

  9. shiro教程1(HelloWorld)

    shiro简介 官网   Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的 ...

最新文章

  1. 企业网络推广期间影响企业网络推广自然排名的因素有哪些?
  2. python官网下载步骤手机-手机python下载
  3. 单片机断电后不保存程序_为什么单片机语音芯片既有flash又有EEPROM
  4. 实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现
  5. android 帧动画旋转,安卓动画实现
  6. step3 . day1 数据结构之线性表顺序表
  7. 【模拟】【递归】电子表格(jzoj 2127)
  8. 选择与循环:剪刀石头布_Python之石头剪刀布小游戏(史上最详细步骤)
  9. 计算机操作基础英语,计算机操作基础word练习题参考答案
  10. pcie1 4 速度_太阳系行星们谁转得最快?八大行星自转速度排行榜,地球排第五...
  11. CentOS7安装Gnome GUI图形界面
  12. .Net中的数字和日期格式化规则助记词
  13. 2017.3.27-morning
  14. powerquery分组_Power Query 基本功能使用
  15. ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  16. 由中秋抢月饼事件想到的
  17. 用天平找次品的算法题,即三等分算法
  18. matlab 矩阵转数组,matlab数组与矩阵
  19. 原来微信还有这三个实用小技巧!简直太方便了
  20. [源码]Meepo路由

热门文章

  1. SQL:使用 CASE
  2. 蓝牙nrf52832的架构
  3. 功率电感器基础讲座-第1章-2_转载自村田官网
  4. CRF++ 特征工程
  5. stdthread(1)thread概述
  6. Docker (3)核心概念
  7. C++ Primer 5th笔记(chap 15 OOP)抽象基类
  8. 机器学习+算法考试有感 2019 山东大学
  9. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  10. Java UDP Demo