shiro入门实战笔记(5)--权限认证(下)

时间:2022-10-06 15:18:09

[本系列文章是博主的学习笔记,而非经典教程,特此说明]

在上文中,我们介绍的权限认证基本实现方式,本文我们来介绍shiro授权的基本方式的概念及流程。另外,本文中并不会演示具体的代码,而是等到后续文章中有具体的例子时再做演示。还请各位看官先仔细理解下文叙述的概念及流程,方便后续学习。

-------------------------------------------------------------------------------------------------------------------------------------

正文开始:

1.我们先来温习前文中的示例代码的具体作用。

a.配置文件:显而易见的,我们看到ini的配置文件中,除了用户名,密码,我们还是用逗号为间隔,定义了一组role。这些role就是我们在shiro中所讲的角色的概念,一个用户可以对应一个或者多个角色。具体请参照前文实体的配置。并且,我们在前文中的第二份ini配置文件中发现,我们使用逗号为间隔,针对每一个role我们又定义的一个或者一组权限。至此,我们在shiro中权限认证中核心的用户,角色,权限的概念都已经通过使用配置文件的方式体现出来。请读者仔细理解。

b.读取文件:在前文中,我们把读取配置文件的方法单独作为一个util工具包,读取配置文件之后,我们返回一个subject对象。这个subject对象就是我们系统需要进行认证授权的用户,可以是人,也可以是物。需要特别注意的是,我们在独立出这部分代码的同时,移除了最后用户退出的动作,这样能够使我们在调用方法之后保证用户能够继续在程序中运行,当最终推出程序时,在执行用户推出操作。各位看官千万不要忽视这个细节。

c.权限认证:在shiro已经提供的权限认证中,大部分方法的使用方法是一致的。因此在前文中,我们只是简单的以某一个方法为例说明shiro进行权限认证的具体使用,下面我们列举出所有具体的方法调用方式,请读者们按照自己的需求选自自行的实现。特别的,这些方式会随着shiro的更新不断变化,请读者在次环节一定要参考官方文档的示例进行学习与使用。下面我们给出截止到本文发表时官方文章中给的方法api:

shiro入门实战笔记(5)--权限认证(下)

shiro入门实战笔记(5)--权限认证(下)

shiro入门实战笔记(5)--权限认证(下)

上面的方法中,我们推荐使用第二个String类型参数。具体使用请参考前文

shiro入门实战笔记(5)--权限认证(下)

shiro入门实战笔记(5)--权限认证(下)

至此,我们把前文中代码遗留的问题进行叙述,如有问题,敬请留言。

2.注解式认证:Spring是我们开发中常用的基础框架,因此我们在本节内容以介绍spring的注解使用为主,如果读者有其他需求,还请访问官方文档中进行学习。

官方已经提供的内容如下:

shiro入门实战笔记(5)--权限认证(下)

下面我们就正式来介绍shiro在spring条件下的使用。

a.@RequiresAuthentication:要求当前的subject已经在当前的session中被验证通过才能被访问或者调用。

b.@RequiresGuest:要求当前的subject是一个“guest”,即要求当前用户没有被验证或者记住才能被访问或者调用。

c.@RequiresPermission("account:create"):要求当前的subject被允许一个或者多个权限,才能执行被此注解注解的方法。

d.@RequiresRoles("administrator"):要求当前的subject拥有所指定的角色,如果没有,则该方法不会被执行,并且会抛出AuthorizattionException异常。

e.@RequruesUser:要求当前的subject是一个应用程序用户才能被注解的类/方法/实例访问或者调用。一个“应用程序用户”被定义为一个拥有已知身份,或者在当前session中由于通过验证被确认,或者在之前的session中的RememberMe服务被记住。

至此,截止目前我们在官方文档中发现的shiro支持的注解我们已经全部进行了解释。关于具体的使用,心急的读者可以访问官方文档进行查看。

3.授权流程:

shiro入门实战笔记(5)--权限认证(下)

第一步:当前的subject调用isPermitted*/hasRole*接口,然后委托给SecurityManager,而SecurityManager接着会委托给Authorizer。

第二步:Authorizer是真正的授权者,如果我们调用上面的接口,其首先通过PermissionResolver把字符串转换成相应的Permission实例。

第三步:在进行授权之前,会调用相应的Realm获取subject相应的角色/权限用于匹配传入的角色/权限

第四步:Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给ModularRealmAuthorizer进行循环判断,如果匹配到示例的isPermitted*/hasRole*,则结果为true,否则为false


ModularRealmAuthorizer进行多个Realm匹配流程:

a.首先检查相应的Realm是否实现了Authorizer。

b.如果实现了Authorizer,那么接着调用其相应的isPermitted*/hasRols*接口进行匹配。

c.如果有一个Realm匹配那么返回true,否则返回false。


-------------------------------------------------------------------------------------------------------------------------------------

至此,shiro入门实战笔记(5)--权限认证(下)结束


参考资料:

官方文档:http://shiro.apache.org/documentation.html

其他博文:http://jinnianshilongnian.iteye.com/blog/2018936