源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-03-01 04:12 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Apache Shiro 使用手册(三) Shiro授权
如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等。 [b]一、授权的三要素 [/b] 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。 而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。 权限声明及粒度 Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。 下面以实例来说明权限表达式。 可查询用户数据 User:view 可查询或编辑用户数据 User:view,edit 可对用户数据进行所有操作 User:* 或 user 可编辑id为123的用户数据 User:edit:123 角色 Shiro支持两种角色模式: 1、传统角色:一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。 2、权限角色:一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。 下面将详细描述对两种角色模式的授权实现。 [b]二、授权实现 [/b] Shiro支持三种方式实现授权过程: 编码实现 注解实现 JSP Taglig实现 1、基于编码的授权实现 1.1基于传统角色授权实现 当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole*方法验证。
[url=login.jsp]</shiro:guest>
user标签 认证通过或已记住的用户 authenticated标签 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。
[url=updateAccount.jsp]</shiro:authenticated>
notAuthenticated标签 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
principal 标签 输出当前用户信息,通常为登录帐号信息
[url=admin.jsp]</shiro:hasRole>
lacksRole标签 与hasRole标签逻辑相反,当用户不属于该角色时验证通过
hasAnyRole标签 验证当前用户是否属于以下任意一个角色。
[url=createUser.jsp]</shiro:hasPermission>
lacksPermission标签 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过
三、Shiro授权的内部处理机制 [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100100_0_74224.png[/img] 1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等) 2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。 3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。 4、每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。 当使用多个Realm时,不同于认证策略处理方式,授权处理过程中: 1、当调用Realm出现异常时,将立即抛出异常,结束授权验证。 2、只要有一个Realm验证成功,那么将认为授权成功,立即返回,结束认证。 
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部