Apache Shiro 使用手册(三)Shiro 授权

TMC2209的UART模式详解:如何用串口调试助手配置细分和电流(避坑指南) 本文深入解析TMC2209步进电机驱动器的UART模式,详细讲解如何通过串口调试助手配置细分和电流,包括硬件连接、通信协议、关键寄存器设置及高级功能应用。提供实战避坑指南,帮助开发者优化步进电机控制性能,适用于精密仪器、3D打印等场景。 阅读详情
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。
如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等。

一、授权的三要素

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

权限
权限是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基于传统角色授权实现

当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole*方法验证。
Java代码   收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2. if (currentUser.hasRole("administrator")) {  
  3.     //show the admin button  
  4. } else {  
  5.     //don't show the button?  Grey it out?  
  6. }  

相关验证方法如下:
Subject方法描述
hasRole(String roleName)当用户拥有指定角色时,返回true
hasRoles(List<String> roleNames)按照列表顺序返回相应的一个boolean值数组
hasAllRoles(Collection<String> roleNames)如果用户拥有所有指定角色时,返回true

断言支持
Shiro还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。使用断言,可以使我们的代码更加简洁。
Java代码   收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2. //guarantee that the current user is a bank teller and  
  3. //therefore allowed to open the account:  
  4. currentUser.checkRole("bankTeller");  
  5. openBankAccount();  

断言的相关方法:
Subject方法描述
checkRole(String roleName)断言用户是否拥有指定角色
checkRoles(Collection<String> roleNames)断言用户是否拥有所有指定角色
checkRoles(String... roleNames)对上一方法的方法重载

1.2 基于权限角色授权实现
相比传统角色模式,基于权限的角色模式耦合性要更低些,它不会因角色的改变而对源代码进行修改,因此,基于权限的角色模式是更好的访问控制方式。
它的代码实现有以下几种实现方式:
1、基于权限对象的实现
创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted()进行验证。
Java代码   收藏代码
  1. Permission printPermission = new PrinterPermission("laserjet4400n", "print");  
  2. Subject currentUser = SecurityUtils.getSubject();  
  3. if (currentUser.isPermitted(printPermission)) {  
  4.     //show the Print button  
  5. } else {  
  6.     //don't show the button?  Grey it out?  
  7. }  
  8. Permission printPermission = new PrinterPermission("laserjet4400n", "print");  
  9. Subject currentUser = SecurityUtils.getSubject();  
  10. if (currentUser.isPermitted(printPermission)) {  
  11.     //show the Print button  
  12. } else {  
  13.     //don't show the button?  Grey it out?  
  14. }  

相关方法如下:
Subject方法描述
isPermitted(Permission p)Subject拥有制定权限时,返回treu
isPermitted(List<Permission> perms)返回对应权限的boolean数组
isPermittedAll(Collection<Permission> perms)Subject拥有所有制定权限时,返回true

2、 基于字符串的实现
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。
Java代码   收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2. if (currentUser.isPermitted("printer:print:laserjet4400n")) {  
  3.     //show the Print button  
  4. } else {  
  5.     //don't show the button?  Grey it out?  
  6. }  

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

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

基于权限对象的断言实现
Java代码   收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2. //guarantee that the current user is permitted  
  3. //to open a bank account:  
  4. Permission p = new AccountPermission("open");  
  5. currentUser.checkPermission(p);  
  6. openBankAccount();  

基于字符串的断言实现
Java代码   收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2. //guarantee that the current user is permitted  
  3. //to open a bank account:  
  4. currentUser.checkPermission("account:open");  
  5. openBankAccount();  

断言实现的相关方法
Subject方法说明
checkPermission(Permission p)断言用户是否拥有制定权限
checkPermission(String perm)断言用户是否拥有制定权限
checkPermissions(Collection<Permission> perms)断言用户是否拥有所有指定权限
checkPermissions(String... perms)断言用户是否拥有所有指定权限

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

相关的注解:
@ RequiresAuthentication
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。
Java代码   收藏代码
  1. @RequiresAuthentication  
  2. public void updateAccount(Account userAccount) {  
  3.     //this method will only be invoked by a   
  4.     //Subject that is guaranteed authenticated  
  5.     ...  
  6. }  

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

@ RequiresPermissions
当前用户需拥有制定权限
Java代码   收藏代码
  1. @RequiresPermissions("account:create")  
  2. public void createAccount(Account account) {  
  3.     //this method will only be invoked by a Subject  
  4.     //that is permitted to create an account  
  5.     ...  
  6. }  

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

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

3、基于JSP  TAG的授权实现
Shiro提供了一套JSP标签库来实现页面级的授权控制。
在使用Shiro标签库前,首先需要在JSP引入shiro标签:
Java代码   收藏代码
  1. <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>  

下面一一介绍Shiro的标签:
guest标签
验证当前用户是否为“访客”,即未认证(包含未记住)的用户
Xml代码   收藏代码
  1. <shiro:guest>  
  2.     Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!  
  3. </shiro:guest>  

user标签
认证通过或已记住的用户
Xml代码   收藏代码
  1. <shiro:user>  
  2.     Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.  
  3. </shiro:user>  

authenticated标签
已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。
Xml代码   收藏代码
  1. <shiro:authenticated>  
  2.     <a href="updateAccount.jsp">Update your contact information</a>.  
  3. </shiro:authenticated>  

notAuthenticated标签
未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
Xml代码   收藏代码
  1. <shiro:notAuthenticated>  
  2.     Please <a href="login.jsp">login</a> in order to update your credit card information.  
  3. </shiro:notAuthenticated>  

principal 标签
输出当前用户信息,通常为登录帐号信息
Xml代码   收藏代码
  1. Hello, <shiro:principal/>, how are you today?  

hasRole标签
验证当前用户是否属于该角色
Xml代码   收藏代码
  1. <shiro:hasRole name="administrator">  
  2.     <a href="admin.jsp">Administer the system</a>  
  3. </shiro:hasRole>  

lacksRole标签
与hasRole标签逻辑相反,当用户不属于该角色时验证通过
Xml代码   收藏代码
  1. <shiro:lacksRole name="administrator">  
  2.     Sorry, you are not allowed to administer the system.  
  3. </shiro:lacksRole>  

hasAnyRole标签
验证当前用户是否属于以下任意一个角色。
Xml代码   收藏代码
  1. <shiro:hasAnyRoles name="developer, project manager, administrator">  
  2.     You are either a developer, project manager, or administrator.  
  3. </shiro:lacksRole>  

hasPermission标签
验证当前用户是否拥有制定权限
Xml代码   收藏代码
  1. <shiro:hasPermission name="user:create">  
  2.     <a href="createUser.jsp">Create a new User</a>  
  3. </shiro:hasPermission>  

lacksPermission标签
与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过
Xml代码   收藏代码
  1. <shiro:hasPermission name="user:create">  
  2.     <a href="createUser.jsp">Create a new User</a>  
  3. </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验证成功,那么将认为授权成功,立即返回,结束认证。



原文链接:http://kdboy.iteye.com/blog/1155450

torch.nn.rnn实现循环神经网络 ------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、... 阅读详情

相关推荐

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2031

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

1、这些值是存在数据库里的,在哪里找呢?sys_menu 中的permission列。 <shiro:hasPermission name=“cms:article:edit”> 他是怎么入库的呢?非菜单项的权限是怎么加入,怎么取出来使用的? 取出来的sql: SELECT a.id , a.parent_id AS "parent.id" , a.paren...

dxyzhbb的博客 2万+

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 338

Shiro权限

什么是授权 授权就是在认证的基础上给用户进行角色和权限的授予。权限定义了一个用户是否可以执行某个操作。角色是一组权限的集合,我们通常把一组权限绑定到一种角色上,再吧一个或者多个角色赋给一个用户,这样就是实现了权限的控制。 Shiro授权核心概念 权限 : 即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利 角色 : 是权限的集合,一种角色可以包含多种权限 用户 ...

Brooks Lv 4980

DP_AUX辅助通道介绍

DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。其中辅助通道(AUX)是一条独立双向半双工的传输通道,它也是一对差分信号线。其数据传输速率1Mbps,用来传输配置参数与指令。

cjie221的博客 5349

EndNote全文检索实战:如何快速配置学校图书馆资源并精准查找文献

本文详细介绍了EndNote全文检索功能的实战配置方法,核心在于通过正确设置OpenURL链接解析器,无缝对接学校图书馆资源,实现一键精准获取文献全文。文章提供了从理解机制、四步配置法到进阶技巧的完整指南,帮助科研人员高效管理海量PDF,构建个人知识体系,大幅提升文献调研与写作效率。

weixin_29228781的博客 279

【Shiro原理一】shiro:hasPermission 隐藏页面无权访问的资源

shiro:hasPermission 隐藏页面无权访问的资源,因为层层调用方法,下面可能有点儿乱,注意上下结合看方法名。 jsp: organ_list.jsp &lt;shiro:hasPermission name="jigouxinxi-xinzeng"&gt; &lt;button class="layui-btn layui-btn-primary" onclick="a...

朱赤墨黑 6251

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

Shiro <shiro:hasPermission 标签不生效,shiro权限不生效原因

第一个可能配置文件:shiroConfig.java没加这个 /** * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证 * 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能 * @return */ @Bean @ConditionalO

ZGIT的博客 7760

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7891

热力学仿真软件:COMSOL Heat Transfer_(18).案例研究:工业加热炉优化

工业加热炉的优化设计和操作参数调整是提高制造过程效率和产品质量的关键。通过仿真软件如COMSOL Multiphysics,可以精确地分析炉内的温度分布、能耗和热损失,从而提出有效的优化方案。本文通过一个实际应用案例,展示了如何利用仿真技术进行工业加热炉的综合优化,并通过实验验证了优化方案的有效性。希望这些方法和案例可以为其他制造企业提供参考,帮助他们在实际生产中提高加热炉的性能和效率。

kkchenjj的博客 1008
上一篇: Apache Shiro 使用手册(二)Shiro 认证
下一篇: Apache Shiro 使用手册(四)Realm 实现
AlvinTech14
博客等级 码龄12年 10粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值