热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheShiro编程方式授权

最简单和最常见的方式来执行授权是直接以编程方式与当前Subject实例交互。基于角色授权Rolechecks(角色检查)如果你只是简单的想检查当前的Subject是否拥有一个角色,你可以在Sub

最简单和最常见的方式来执行授权是直接以编程方式与当前Subject 实例交互。

基于角色授权

Role checks(角色检查)

如果你只是简单的想检查当前的Subject 是否拥有一个角色,你可以在Subject 实例上调用hasRole方法。例如:

Subject currentUser = SecurityUtils.getSubject();

if(currentUser.hasRole("administrator")) {

//show the admin button

} else {

//don't show the button? Grey it out?

}

相关的角色检查方法如下:

Subject方法

描述

hasRole(String roleName)

返回true 如果Subject 被分配了指定的角色,否则返回false。

hasRoles(List roleNames)

返回true 如果Subject 被分配了所有指定的角色,否则返回false。

hasAllRoles(Collection roleNames)

返回一个与方法参数中目录一致的hasRole 结果的数组。

Role Assertions(角色断言)

Shiro还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息AuthorizationException。例如:

Subject currentUser = SecurityUtils.getSubject();

//guarantee that the current user is a bank teller and

//therefore allowed to open the account:

currentUser.checkRole("bankTeller");

openBankAccount();

相关的断言检查方法如下:

Subject方法

描述

checkRole(String roleName)

安静地返回,如果Subject 被分配了指定的角色,不然的话就抛出。

checkRoles(Collection roleNames)

安静地返回,如果Subject 被分配了所有的指定的角色,不然的话就抛出。

checkRoles(String... roleNames)

与上面的checkRoles 方法的效果相同,但允许Java5 的var-args 类型的参数。

基于权限授权

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

如果你想进行检查,看一个Subject 是否被允许做某事,你可以调用各种isPermitted*方法的变种。检查权限主要有两个方式——基于对象的权限实例或代表权限的字符串。

Object-based Permission Checks(基于对象的权限检查)

执行权限检查的一个可行方法是实例化org.apache.shiro.authz.Permission 接口的一个实例,并把它传递给接收权限实例的*isPermitted 方法。比如,在办公室有一台打印机,具有唯一标识符laserjet4400n。我们的软件需要检查当前用户是否被允许在该打印机上打印文档。上述情况的权限检查可以明确地像这样表达:

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?

}

相关的验证方法如下:

Subject方法

描述

isPermitted(Permission p)

返回true 如果该Subject 被允许执行某动作或访问被权限实例指定的资源集合,否则返回false。

isPermitted(List perms)

返回一个与方法参数中目录一致的isPermitted 结果的数组。

isPermittedAll(Collection perms)

返回true 如果该Subject 被允许所有指定的权限,否则返回false。

String-based permission checks(基于字符串的权限检查)

基于对象的权限可以是很有用的(编译时类型安全,保证行为,定制蕴含逻辑等),但它们有时对应用程序来说会感到有点“笨手笨脚”的。另一种方法是使用正常的字符串来表示权限实例。例如上述的例子使用基于字符串的权限检查如下:

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted("printer:print:laserjet4400n")) {

//show the Print button

} else {

//don't show the button? Grey it out?

}

这个例子显示了一个特殊冒号分隔的格式,它由Shiro 默认的org.apache.shiro.authz.permission.WildcardPermission 实现来定义的。这里分别代表了:资源类型:操作:资源ID WildcardPermission token 规定和构造操作的格式在Shiro Permission 文档中被深入的涉及到。除了上面的字符串默认的WildcardPermission 格式,你可以创建和使用自己的字符串格式如果你喜欢的话。

相关的验证方法如下:

Subject方法

描述

isPermitted(String perm)

返回true 如果该Subject 被允许执行某动作或访问被字符串权限指定的资源,否则返回false

isPermitted(String…perms)

返回一个与方法参数中目录一致的isPermitted 结果的数组。

isPermittedAll(String…perms)

返回true 如果该Subject 被允许所有指定的字符串权限,否则返回false

Permission Assertions(权限断言)

以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息AuthorizationException。例如:

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("open");

openBankAccount();

相关的断言方法如下:

Subject方法

描述

checkPermission(Permission p)

安静地返回,如果Subject 被允许执行某动作或访问被特定的权限实例指定的资源,不然的话就抛出AuthorizationException 异常。

checkPermission(String perm)

安静地返回,如果Subject 被允许执行某动作或访问被特定的字符串权限指定的资源,不然的话就抛出AuthorizationException 异常。

checkPermissions(Collection perms)

安静地返回,如果Subject 被允许所有的权限,不然的话就抛出AuthorizationException 异常。

checkPermissions(String… perms)

和上面的checkPermissions 方法效果相同,但是使用的是基于字符串的权限。



推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
r_elease靜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有