Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

三、shiro授权

16. Shiro_权限配置

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

DefaultFilter这个类中定义了有shiro中的过滤器,

 

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

17. Shiro_授权流程分析

要实现授权功能只需要将类继承AthurizingRealm类,因为AuthrizingRealm是继承自AuthenticatingRealm类的一个抽象方法。

可以通过点击Subject类的hasRole()方法一层一层最后进入到这个抽象类看到doGetAuthorizationInfo这个抽象方法。

 

18. Shiro_多 Realm 授权的通过标准?

通过源码分析来看, 还是点击进入hasRole方法,其中第一个接口点开选择实现类的时候,可以看到有个ModularRealmAuthorizer这个类,点击进入可以发现其中只要有1个realm授权通过就return true 。第247行

} while(!(realm instanceof Authorizer) || !((Authorizer)realm).hasRole(principals, roleIdentifier));

return true;

 

 

19. Shiro_实现授权 Realm?

由于上面只要有1个realm通过就可以通过授权了,所以接下来我们只看一个realm就是ShiroRealm这个类。查看授权方法中的步骤讲解。就可以实现以user登录访问admin.jsp就没有授权,只能访问user.jsp。admin登录就可以访问admin.jsp页面。

 

20. Shiro_标签

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

username这个是构建SimpleAuthenticationInfo中传入principal的一个对象而不是字符串的话,就可以在这个标签中放入该对象的属性。

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

 

接下来代码讲解 list.jsp页面,首先导入标签库。      演示了Admin和User用户两个不同角色登录的显示。

 

21. Shiro_权限注解

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解

注解可以放到Controller层中, 也可以放到Service层中。

 

写了ShiroService类,并创建testMethod方法,然后在将类放到了IOC容器中。

 

然后在ShiroHandler中注入了ShiroService,并且写了testShiroAnnotation方法,

 

然后在list.jsp页面添加了testShiroAnnotation的链接标签。然后在ShiroService类中的testMethod方法上面添加@RequiresRoles({“admin”}),就可以实现用admin登录后在list页面点击Test ShiroAuthorization链接后重定向会list页面。而user登录的就不行。

 

需要注意的一点,一般在Service层中我们会天剑@Transactioncal注解来添加事务,这个时候Service层呢就已经是一个代理对象了,这个时候将权限的注解加到Service层是不好用的, 这个时候需要加到Controller层中,也就是不能让Service层是代理的代理,这个时候在注入的时候会产生类型转换异常。

 

22. Shiro_从数据表中初始化资源和权限

受保护的资源,根据对应的权限关系,是配死到了applicationContext.xml文件中的, 当资源和权限的关系比较多的时候就比较麻烦了,所以考虑存入数据库这种方式通过一个sql来取出来是比较合适的,那如何做到呢。

 

这个配置其实是配到了xml的标签类filterChainDefinition类中的,点击进入到类中, 它其实是一个方法,调了setFilterChainDefinitionMap这个方法, 在方法中打断点走起,我们可以看出这个map中传入的是一个linkedHashMap,

Shiro笔记三:Shiro权限配置、Shiro授权流程分析、Shiro多 Realm 授权的通过标准、实现授权 Realm、Shiro标签、Shiro权限注解  

 

其中正好就是我们在配置文件中配置的权限关系的键值对,这就是实际的配置的效果。

 

所以我们只需要构建一个map,然后给配为filterChainDefinitionMap这个属性就可以了。

 

开始,首先将xml中配置的键值对给注释掉, 然后自己定义指向一个filterChainDefinitionMap ,

<property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property>

 

我们要配置一个bean,这个bean实际上是一个map

<!-- 配置一个 bean, 该 bean 实际上是一个 Map. 通过实例工厂方法的方式 -->

 

首先构建一个实例工厂类FilterChainDefinitionMapBuilder, 并配置bean

<bean id="filterChainDefinitionMapBuilder"
  
class="com.atguigu.shiro.factory.FilterChainDefinitionMapBuilder"></bean>

 

然后用这个实例工厂类再配实例,

<bean id="filterChainDefinitionMap"
  
factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"></bean>

 

这个时候就刚才的setFilterChainDefinitionMap处的断点继续重新启动, 并没有在工厂类的方法中给map添加元素,我们就可以在debug控制台中看到,这个LinkedHashMap是空的。