2019独角兽企业重金招聘Python工程师标准>>>

一、授权的三要素

授权有着三个核心元素:权限、角色和用户。

权限

  • 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。

  • 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。

  • 而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。

  • 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。

权限声明及粒度

Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。

下面以实例来说明权限表达式。

可查询用户数据
User:view
可查询或编辑用户数据
User:view,edit
可对用户数据进行所有操作
User:* 或 user
可编辑id为123的用户数据
User:edit:123

角色

Shiro支持两种角色模式: 
1、传统角色:一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。 
2、权限角色:一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。 
下面将详细描述对两种角色模式的授权实现。

二、授权实现

Shiro支持三种方式实现授权过程:

  • 编码实现

  • 注解实现

  • JSP Taglig实现

1、基于编码的授权实现

1.1基于传统角色授权实现 
当需要验证用户是否拥有某个角色(1)时,可以调用Subject 实例的hasRole*(2)方法验证。

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {//show the admin button
} else {//don't show the button?  Grey it out?
}

相关验证方法如下:

断言支持 
Shiro还支持以断言的方式进行授权验证断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。使用断言,可以使我们的代码更加简洁。

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();

断言的相关方法:

1.2 基于权限角色授权实现 
相比传统角色模式,基于权限的角色模式耦合性要更低些,它不会因角色的改变而对源代码进行修改,因此,基于权限的角色模式是更好的访问控制方式。 
它的代码实现有以下几种实现方式:

1、基于权限对象的实现 
创建org.apache.shiro.authz.Permission的实例(1),将该实例对象作为参数传递给Subject.isPermitted()进行验证(2)

Permission printPermission = new PrinterPermission("laserjet4400n", "print");
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted(printPermission)) {//show the Print button
} else {//don't show the button?  Grey it out?
}

相关方法如下:

2、 基于字符串的实现 
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted("printer(资源类型):print(操作):laserjet4400n(资源ID)")) {//show the Print button
} else {//don't show the button?  Grey it out?
}

使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission 默认支持的实现方式。 
这里分别代表了 资源类型:操作:资源ID

类似基于对象的实现相关方法,基于字符串的实现相关方法: 
isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms)

基于权限对象的断言实现

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is permitted
//to open a bank account:
Permission p = new AccountPermission("open");
currentUser.checkPermission(p);
openBankAccount();

基于字符串的断言实现

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is permitted
//to open a bank account:
currentUser.checkPermission("account:open");
openBankAccount();

断言实现的相关方法

2、基于注解的授权实现 
Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的配置。

相关的注解: 
@ RequiresAuthentication 
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户

@RequiresAuthentication
public void updateAccount(Account userAccount) {//this method will only be invoked by a //Subject that is guaranteed authenticated...
}

@ RequiresGuest 
表明该用户需为”guest”用户

@ RequiresPermissions 
当前用户需拥有制定权限

@RequiresPermissions("account:create")
public void createAccount(Account account) {//this method will only be invoked by a Subject//that is permitted to create an account...
}

@RequiresRoles 
当前用户需拥有制定角色

@ RequiresUser 
当前用户需为已认证用户或已记住用户

3、基于JSP  TAG的授权实现 
Shiro提供了一套JSP标签库来实现页面级的授权控制。 
在使用Shiro标签库前,首先需要在JSP引入shiro标签:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

下面一一介绍Shiro的标签: 
guest标签 
验证当前用户是否为“访客”,即未认证(包含未记住)的用户

<shiro:guest>Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>

user标签 
认证通过或已记住的用户

<shiro:user>Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>

authenticated标签 
已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。

<shiro:authenticated><a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>

notAuthenticated标签 
未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。

<shiro:notAuthenticated>Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>

principal 标签 
输出当前用户信息,通常为登录帐号信息

Hello, <shiro:principal/>, how are you today?

hasRole标签 
验证当前用户是否属于该角色

<shiro:hasRole name="administrator"><a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

lacksRole标签 
与hasRole标签逻辑相反,当用户不属于该角色时验证通过

<shiro:lacksRole name="administrator">Sorry, you are not allowed to administer the system.
</shiro:lacksRole>

hasAnyRole标签 
验证当前用户是否属于以下任意一个角色。

<shiro:hasAnyRoles name="developer, project manager, administrator">You are either a developer, project manager, or administrator.
</shiro:lacksRole>

hasPermission标签 
验证当前用户是否拥有制定权限

<shiro:hasPermission name="user:create"><a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

lacksPermission标签 
与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过

<shiro:hasPermission name="user:create"><a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

三、Shiro授权的内部处理机制

1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等) 
2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。 
3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。 
4、每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。

当使用多个Realm时,不同于认证策略处理方式,授权处理过程中: 
1、当调用Realm出现异常时,将立即抛出异常,结束授权验证。 
2、只要有一个Realm验证成功,那么将认为授权成功,立即返回,结束认证。 

转载于:https://my.oschina.net/heroShane/blog/198184

Apache Shiro 使用手册(三)Shiro 授权相关推荐

  1. Shiro笔记(三)授权

    Shiro笔记(三)授权 一.授权方式 1.编程式: 1 Subject subject=SecurityUtils.getSubject(); 2 if(subject.hasRole(" ...

  2. Apache Shiro 使用手册

    2019独角兽企业重金招聘Python工程师标准>>> 很好的学习资源,谢谢kdboy博主! Apache Shiro 使用手册(一)Shiro架构介绍   http://kdboy ...

  3. Apache Shiro 使用手册---转载

    原文地址:http://www.360doc.com/content/12/0104/13/834950_177177202.shtml (一)Shiro架构介绍 一.什么是Shiro  Apache ...

  4. Apache Shiro 使用手册(五)Shiro 配置说明

    Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前 ...

  5. SpringBoot整合Shiro实现登录认证和授权CHCache

    文章目录 一. springboot实现普通登录 1 添加依赖 2 编写配置文件 3 新建实体类和mapper 4 编写业务层代码 5 编写控制器 6 编写启动类 7 编写登录页面和主页面 二. sp ...

  6. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板

    主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...

  7. Day374.shiro授权Shiro+jsp整合Springboot -Shiro

    Shiro授权 一.授权 授权,即访问控制,控制谁能访问哪些资源.主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的. 二.关键对象 授权可简单理解为who对what( ...

  8. Shiro用户认证和用户授权流程

    有时候觉得'如约而至'是个多么美好的词,等的很辛苦,却不辜负.--<匿名> 1.引言 传统权限管理使用基于url拦截的权限管理方式,实现起来比较简单,不依赖框架,使用web提供filter ...

  9. shiro学习笔记(三)知识整合

    参考 小D课堂 二当家小D老师的笔记 小滴课堂官网:https://xdclass.net/#/index 官网 第1章 Shiro权限实战课程介绍 第1集 Shiro权限实战课程介绍 简介:讲解为什 ...

最新文章

  1. UI培训分享:如何成为一名优秀的UI设计师
  2. 第四百一十六天 how can I 坚持
  3. C++基础知识-Day8
  4. Elasticsearch对外提供分词服务实践
  5. eclipse/myeclipse选中编辑区域文件,Package Explorer定位文件所在项目及目录
  6. 容器安全拾遗 - Rootless Container初探
  7. 中小微企业公共信用数据的风险评估
  8. 《3D打印:正在到来的工业革命》——1.1节3D 技术打印是如何工作的
  9. c语言 word转pdf,批量Word转PDF之捷径
  10. android 显示系统时间,Android 实时获取当前时间并显示
  11. erfc怎么用计算机计算,erfc(erfc函数如何计算)
  12. tx2上装scikit-image
  13. java电子贺卡_用java写一个新春贺卡,可转exe的
  14. heka 输出到mysql_heka - 基于Go开发的日志收集工具,可用Go或lua开发插件
  15. 视频网站存储在服务器,网络视频存储服务器
  16. 千万千万不可运行的 Linux 命令
  17. MybatisPlus代码生成器实现只覆盖指定文件
  18. java url参数转map_url参数和map之间的转换
  19. OFDMA和OFDM的区别
  20. Html5新特性之meter

热门文章

  1. java都界面相对布局_浏览器的重排和重绘
  2. Linux查看端口号是否使用
  3. zblog文件大小超出,上传成功但插入不了
  4. Swift5.1 语言参考(六) 声明
  5. android studio 如何让包名展开
  6. 重点 (七) : 开发技巧/方法
  7. 图像几何变换之透视变换
  8. Antd Vue range-picker 日期初始值设置 与 重置日期踩坑总结
  9. centos在yum install报错:Another app is currently holding the yum lock解决方法
  10. CMSGC造成内存碎片的解决方法