`
peterwanghao
  • 浏览: 124399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Shiro 授权过程

 
阅读更多

下面详细介绍在进行授权时,Shiro的内部处理机制。

如上图,我们通过Shiro架构图的授权部分,来说明Shiro授权内部的处理顺序:

1.应用程序或框架代码调用任何SubjecthasRole*,checkRole*,isPermitted*,或者checkPermission*方法的变体,传递任何所需的权限或角色内容。

2.Subject的实例,通常是DelegatingSubject(或子类)代表应用程序的SecurityManager通过调用securityManager的各自相同的hasRole*,checkRole*,isPermitted*,或checkPermission*方法的变体(SecurityManager实现org.apache.shiro.authz.Authorizer接口,他定义了所有Subject具体的授权方法)。

3.SecurityManager,作为一个基本的“保护伞”组件,接替/代表它内部的org.apache.shiro.authz.Authorizer实例通过调用authorizer各自的hasRole*,checkRole*,isPermitted*,或者checkPermissions*方法。默认情况下,authorizer实例是一个ModularRealmAuthorizer实例,它支持协调任何授权操作过程中的一个或多个Realm实例。

4.每个配置好的Realm被检查是否实现了相同的Authorizer接口。如果是,Realm各自的hasRole*,checkRole*,isPermitted*,或checkPermission*方法将被调用。

如前所述,ShiroSecurityManager的默认实现是使用一个ModularRealmAuthorizer实例。ModularRealmAuthorizer同样支持单一的Realm,以及多个Realm的应用。

对于任何授权操作,ModularRealmAuthorizer将遍历其内部的Realm集合,并按顺序与每一个进行交互。每个Realm的交互功能如下:如果Realm自己实现了Authorizer接口,它的各个Authorizer方法(hasRole*,checkRole*,isPermitted*,checkPermission*)将被调用;如果Realm不实现Authorizer接口,它会被忽略。

当存在多个Realms时,ModularRealmAuthorizer根据SecurityManager的配置获得对Realm实例的访问。当执行授权操作时,它会遍历该集合,同时对于每一个自己实现Authorizer接口的Realm,调用Realm各自的Authorizer方法(如hasRole*,checkRole*,isPermitted*,或checkPermission*)。

如果Realm的方法导致异常,该异常将会以AuthorizationException的形式传递给调用者。同时任何剩余的Realm将不会被该授权操作所访问。如果该Realm的方法是一个返回布尔值的hasRole*或者isPermitted*的变体,并且该返回值为true,真值将会立即被返回,同时任何剩余的Realm都将不会访问。这种处理是作为提高性能的一种行为。

当执行基于字符串的权限检查时,Shiro默认实现是将该字符串转换成一个实际的Permission实例。所有ShiroRealm的默认实现是内部的WildcardPermissionResolver,它采用ShiroWildcardPermission字符串格式。你也可以创建自己的PermissionResolver的实现,支持自己的权限字符串语法。可以将你的PermissionResolver设置为全局的。例如:

globalPermissionResolver=com.foo.bar.authz.MyPermissionResolver

securityManager.authorizer.permissionResolver=$globalPermissionResolver

...

也可以为特定的Realm设置自己创建的PermissionResolver。例如:

permissionResolver=com.foo.bar.authz.MyPermissionResolver

realm=com.foo.bar.realm.MyCustomRealm

realm.permissionResolver=$permissionResolver

...

PermissionResolver有相似概念的RolePermissionResolver通过角色执行权限检查。RolePermissionResolver的关键区别是输入的字符串是一个角色名,而不是一个权限字符串。

Shiro中授权有3种方式:

l编写代码——你可以在你的Java代码中用像ifelse块的结构执行授权检查。

lJDK的注解——你可以添加授权注解给你的Java方法。

lJSP/GSP标签库——你可以控制基于角色和权限的JSP或者GSP页面输出。



分享到:
评论

相关推荐

    Apache Shiro使用手册 共22页.pdf

    Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能。Shiro 的架构主要包括三个核心组件:Subject、SecurityManager 和 Realm。 1. 认证(Authentication):用户身份识别,常...

    Apache-Shiro反序列化1

    Apache Shiro 是一个功能强大且易用的 Java 安全框架,提供身份验证、授权、密码和会话管理等功能。然而,在 Apache Shiro 中存在一个严重的反序列化漏洞,CVE-2016-4437,攻击者可以利用该漏洞在服务器上执行恶意...

    Shiro 视频教程+源码+课件

    Apache Shiro 是目前使用率较高的一个 Java 安全框架。本视频基于 Shiro 的新版本 1.3.2 录制。内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业级开发的核心技术...

    SpringShiro分布式缓存版

    class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <!-- end --> --修改了过滤链 <!-- 过滤链定义 --> //简单的讲就是把需要特别处理的路径写到前面,越特殊写...

    Apache Shiro 使用手册(四) Realm 实现

    正如前文所提到的,Shiro的认证过程最终会交由Realm执行,这时会调用Realm的getAuthenticationInfo(token)方法。 该方法主要执行以下操作: 1、检查提交的进行认证的令牌信息 2、根据令牌信息从数据源(通常为数据库)...

    Java全栈工程师-Apache Shiro

    从零开始一步步从Shiro的基本原理,到Shiro完成...本课程讲解Shrio结合数据库的RBAC表进行动态的用户认证和授权的实现过程该课程属于《Java全栈工程师》学习路线中的一门,学习该课程的同时建议配合其他课程一起学习。

    1.初始shiro框架、简单的shiro框架使用.docx

    Shiro 是一个开源的 Java 安全框架,由 Apache 软件基金会开发和维护。它提供了强大的身份验证、授权、加密和会话管理功能,帮助开发者快速构建安全的应用程序。下面是 Shiro 框架的基本使用和概念。 身份验证 ...

    spring+springMVC+shiro 完美demo

    非常完美的spring+springMVC+shiro 完美...简介: Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。是一个很不错的安全框架。 下面记录一下shiro和Spring整合的过程的一个小示例: Web.xml配置 ......

    通俗易懂的Shiro教程(含配套资料)

    Apache Shiro 是目前使用率较高的一个 Java 安全框架。本视频基于 Shiro 的新版本 1.3.2 录制。内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业级开发的核心技术...

    buji-pac4j:用于Shiro的pac4j安全性库:OAuth,CAS,SAML,OpenID Connect,LDAP,JWT。

    buji-pac4j项目是Shiro Web应用程序和Web服务的简单而强大的安全性库,它支持身份验证和授权,还支持CSRF保护等高级功能。 它基于Java 8,Shiro 1.7和v5 。 它在Apache 2许可下可用。 代表认证机制。 它执行登录过程...

    基于SpringBoot+Shiro+Redis+Jwt+Thymeleaf+MyBatis 开发的后台用户、角色+源代码+文档

    Apache Shiro和Spring-Security为权限授权层,redis进行缓存。 Geek-Framework主要定位于微应用的开发,已内置后台系统的基础功能,用户管理、角色管理、权限管理、会员管理、日志管理等;前台已经实现用户登录,...

    百度地图开发java源码-project:springmvc+mybatis

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java...

    Java EE常用框架.xmind

    shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权 传统使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护 而我们的Shiro实现系统的权限管理,有效提高开发效率,从而...

Global site tag (gtag.js) - Google Analytics