- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Apache Shiro 使用手册(三) Shiro授权由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等.
1、授权的三要素 。
授权有着三个核心元素:权限、角色和用户.
权限 。
权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上.
而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户.
权限声明及粒度 。
Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。 下面以实例来说明权限表达式。 可查询用户数据 User:view 可查询或编辑用户数据 User:view,edit 可对用户数据进行所有操作 User:* 或 user 可编辑id为123的用户数据 User:edit:123 。
角色 。
Shiro支持两种角色模式: 1、传统角色:一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。 2、权限角色:一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。 下面将详细描述对两种角色模式的授权实现.
2、授权实现 。
Shiro支持三种方式实现授权过程: 编码实现 注解实现 JSP Taglig实现 1、基于编码的授权实现 。
1.1基于传统角色授权实现 当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole*方法验证。 。
Subject方法 | 描述 |
hasRole(String roleName) | 当用户拥有指定角色时,返回true |
hasRoles(List<String> roleNames) | 按照列表顺序返回相应的一个boolean值数组 |
hasAllRoles(Collection<String> roleNames) | 如果用户拥有所有指定角色时,返回true |
。
Shiro还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。使用断言,可以使我们的代码更加简洁.
。
。
断言的相关方法: 。
Subject方法 | 描述 |
checkRole(String roleName) | 断言用户是否拥有指定角色 |
checkRoles(Collection<String> roleNames) | 断言用户是否拥有所有指定角色 |
checkRoles(String... roleNames) | 对上一方法的方法重载 |
。
相比传统角色模式,基于权限的角色模式耦合性要更低些,它不会因角色的改变而对源代码进行修改,因此,基于权限的角色模式是更好的访问控制方式。 它的代码实现有以下几种实现方式:
1、基于权限对象的实现 。
创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted()进行验证.
。
。
相关方法如下: 。
Subject方法 | 描述 |
isPermitted(Permission p) | Subject拥有制定权限时,返回treu |
isPermitted(List<Permission> perms) | 返回对应权限的boolean数组 |
isPermittedAll(Collection<Permission> perms) | Subject拥有所有制定权限时,返回true |
。
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁.
。
。
使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission 默认支持的实现方式。 这里分别代表了 资源类型:操作:资源ID 。
类似基于对象的实现相关方法,基于字符串的实现相关方法: isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms) 。
基于权限对象的断言实现 。
。
。
基于字符串的断言实现 。
。
。
断言实现的相关方法 。
Subject方法 | 说明 |
checkPermission(Permission p) | 断言用户是否拥有制定权限 |
checkPermission(String perm) | 断言用户是否拥有制定权限 |
checkPermissions(Collection<Permission> perms) | 断言用户是否拥有所有指定权限 |
checkPermissions(String... perms) | 断言用户是否拥有所有指定权限 |
。
相关的注解: @ RequiresAuthentication 可以用户类/属性/方法,用于表明当前用户需是经过认证的用户.
。
。
@ RequiresGuest 表明该用户需为”guest”用户 。
@ RequiresPermissions 当前用户需拥有制定权限 。
。
。
@RequiresRoles 当前用户需拥有制定角色 。
@ RequiresUser 当前用户需为已认证用户或已记住用户 。
3、基于JSP TAG的授权实现 Shiro提供了一套JSP标签库来实现页面级的授权控制。 在使用Shiro标签库前,首先需要在JSP引入shiro标签:
。
。
下面一一介绍Shiro的标签: guest标签 验证当前用户是否为“访客”,即未认证(包含未记住)的用户 。
。
。
user标签 认证通过或已记住的用户 。
。
。
authenticated标签 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在.
。
。
notAuthenticated标签 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户.
。
。
principal 标签 输出当前用户信息,通常为登录帐号信息 。
。
。
hasRole标签 验证当前用户是否属于该角色 。
。
。
lacksRole标签 与hasRole标签逻辑相反,当用户不属于该角色时验证通过 。
。
。
hasAnyRole标签 验证当前用户是否属于以下任意一个角色.
。
。
hasPermission标签 验证当前用户是否拥有制定权限 。
。
。
lacksPermission标签 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过 。
。
。
3、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验证成功,那么将认为授权成功,立即返回,结束认证。 。
最后此篇关于Apache Shiro 使用手册(三) Shiro授权的文章就讲到这里了,如果你想了解更多关于Apache Shiro 使用手册(三) Shiro授权的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3年前关闭。 Improve t
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我可以从哪里下载 cakephp 1.3 的手册.......? 最佳答案 强烈建议不要下载手册,因为它与开发的方式相同,并且可以改进和更改。但是,我承认需要离线副本,您可以在此处找到有关在哪里查看以
我想使用 GKSession 连接两台设备,其中一台作为服务器,另一台作为客户端。使用此配置我无法使用 GKPeerPickerController。 我在连接两个设备时遇到问题: 仅使用蓝牙:不可能
我花了相当多的时间寻找教程并在 Web 服务目录上实现签名和加密。现在我需要扩展该功能以允许每个用户拥有自己的签名和加密 key 。 出于这个原因,我开始四处寻找一些关于如何使用 WSS4J 拦截器的
使用ggplot2我通常使用geom_text和position=jitter之类的东西来注释我的图。 但是 - 对于一个漂亮的情节,我经常发现手动注释是值得的。如下所示: data2 <- stru
谁能推荐一本好的 ANSI SQL 引用手册吗? 我不一定是指教程,而是当您需要基本或更深入的解释或示例时可以查找的适当引用文档。 目前我正在使用W3Schools SQL Tutorial和 SQL
我正在尝试为我的 CS 1 类(class)编写代码。 代码的要点是编写一个代码,您可以在其中从一百美元的钞票中进行任何金额的找零,我需要归还适当的钞票和硬币。 我必须手动编写 JFrame 如果有人
我正在阅读 shellcoder 的手册。我正在跟踪,但由于某种原因无法让我的 shellcode 运行。我已经编译了该程序 gcc -mpreferred-stack-boundary=2 -m32
我的作业(不是家庭作业,只是“如果你能做到就试试”的事情)是使用位操作来加密和解密 .txt 文件。 这是程序。它成功打开文件进行读/写,但将所有 0 和空格放入 output.txt 文件而不是预期
我在谷歌上搜索了很多关于 C 的不必要结果。我希望能在本地获得最好的 C 手册。我发现引用资料很有用 here.我想自己做笔记并删除手册。 Can I manage it somehow like a
我在这个例子中 w.r.t. shellcoder's handbook(second edition),还有一些关于栈的问题 root@bt:~/pentest# gdb -q sc Readin
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
所以我有一份 PDF 手册,我们正在尝试为其创建可打印的 HTML 版本。我遇到了一些障碍,包括: 100% 缩放与缩小以适合(FF/IE 中的默认设置似乎不同) 只打印一页,后面没有空格页脚(或者甚
当我开始使用 PHP(大约 10 年前)时,最吸引我的是 .chm 格式的手册。我过去常常让“索引”选项卡保持打开状态,然后在其中输入我需要的任何内容,它会引导我进入一个漂亮、简洁但详尽的引用页面。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我想更好地了解如何使用 LLDB 调试我的 iOS 代码。我经常看到我的同事使用提示进行调试,例如查看变量的值等等。我在哪里可以找到一些关于如何在命令行上使用 LLDB 调试器的文档? 提前致谢。 最
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
Springer 的 Consolidated Ada Reference Manual 2005 Edition (ISO/IEC 8652:2007(E), Ed. 3) 和 Annotated
我遇到过几个关于使用 mysql 连接器/C++ 的文档,其中所有文档都使用不同的函数来完成相同的事情。例如 `sql::mysql::MySQL_Driver *driver; sql::Conne
我是一名优秀的程序员,十分优秀!