[本系列文章是博主的学习笔记,而非经典教程,特此说明]
在上文中,我们介绍的权限认证基本实现方式,本文我们来介绍shiro授权的基本方式的概念及流程。另外,本文中并不会演示具体的代码,而是等到后续文章中有具体的例子时再做演示。还请各位看官先仔细理解下文叙述的概念及流程,方便后续学习。
-------------------------------------------------------------------------------------------------------------------------------------
正文开始:
1.我们先来温习前文中的示例代码的具体作用。
a.配置文件:显而易见的,我们看到ini的配置文件中,除了用户名,密码,我们还是用逗号为间隔,定义了一组role。这些role就是我们在shiro中所讲的角色的概念,一个用户可以对应一个或者多个角色。具体请参照前文实体的配置。并且,我们在前文中的第二份ini配置文件中发现,我们使用逗号为间隔,针对每一个role我们又定义的一个或者一组权限。至此,我们在shiro中权限认证中核心的用户,角色,权限的概念都已经通过使用配置文件的方式体现出来。请读者仔细理解。
b.读取文件:在前文中,我们把读取配置文件的方法单独作为一个util工具包,读取配置文件之后,我们返回一个subject对象。这个subject对象就是我们系统需要进行认证授权的用户,可以是人,也可以是物。需要特别注意的是,我们在独立出这部分代码的同时,移除了最后用户退出的动作,这样能够使我们在调用方法之后保证用户能够继续在程序中运行,当最终推出程序时,在执行用户推出操作。各位看官千万不要忽视这个细节。
c.权限认证:在shiro已经提供的权限认证中,大部分方法的使用方法是一致的。因此在前文中,我们只是简单的以某一个方法为例说明shiro进行权限认证的具体使用,下面我们列举出所有具体的方法调用方式,请读者们按照自己的需求选自自行的实现。特别的,这些方式会随着shiro的更新不断变化,请读者在次环节一定要参考官方文档的示例进行学习与使用。下面我们给出截止到本文发表时官方文章中给的方法api:
上面的方法中,我们推荐使用第二个String类型参数。具体使用请参考前文
至此,我们把前文中代码遗留的问题进行叙述,如有问题,敬请留言。
2.注解式认证:Spring是我们开发中常用的基础框架,因此我们在本节内容以介绍spring的注解使用为主,如果读者有其他需求,还请访问官方文档中进行学习。
官方已经提供的内容如下:
下面我们就正式来介绍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.授权流程:
第一步:当前的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