Shiro的授权机制

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

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

1. 应用程序或框架代码调用任何Subject 的hasRole*, 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*方法将被调用。

如前所述,Shiro SecurityManager 的默认实现是使用一个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 实例。所有Shiro Realm 的默认实现是内部的WildcardPermissionResolver,它采用Shiro 的WildcardPermission 字符串格式。你也可以创建自己的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 代码中用像if 和else 块的结构执行授权检查。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值