shiro学习12-访问权限控制-shiroFilterFactoryBean
从这一节开始开始学习请求的访问控制,即用户的每一次的访问的限制,这个事根据配置的用户的角色和权限来决定url对于特定的用户能不能访问。
我们从shiroFilterFactoryBean开始。
这个类是真正的filter,我们在web.xml中配置的DelegatingFilterProxy其实就是代理的他,当每一次请求来了之后,这个代理的fiter会将请求转发给这个正真的filter,但是这个真正的filter并没有实现filter接口,他往spring的 context中放置的就是一个filter——SpringShiroFilter,原因在于他的getObject方法返回的值一个SpringShiroFilter,源码:
public Object getObject() throws Exception {
if (instance == null) {
instance = createInstance();
}
return instance;
}
而且放入的类也是这个类:
public Class getObjectType() {
return SpringShiroFilter.class;
}
所以我们配置的DelegatingFilterProxy其实是将清秋转发给了这个SpringShiroFilter,这个类其实就是一个AbstractShiroFilter,所有运行的代码都在这个类中,关于这个类的介绍在后面的filter的章节中。
shiroFilterFactoryBean有连个属性:一个是filter,是一个map,用来存放我们在spring context中的所有的filter,键是filter的beanname,value是filter,程序会将spring context中的所有的filter的子类放入到这个map里面。还有一个属性是filterChainDefinitionMap,用来存放放置的路径魔板和过滤器的名字。但是我没有搞懂它里面到底是如何约定的,如果我配置上key的话,比如如下,就会报错
<property name="filterChainDefinitions">
<map>
<entry key="NO1" value="/visit=checkAuthenticatedFilter[a,b,3]"/>
<entry key="NO2" value="/visit2=checkAuthenticatedFilter[C,D,4]"/>
</map>
</property>
还是按照别人已经弄成功的例子来配置吧,如果配置成如下,
<property name="filterChainDefinitions">
<value>
/visit=checkAuthenticatedFilter[a,b] //这里面一定要有换行符,但是千万不要有\t(制表符,会出错),有空格不要紧,都会删除掉的。
/visit2=checkAuthenticatedFilter[c,d]
</value>
</property>
他在转化为filterChainDefinitionMap时是:
/visit=checkAuthenticatedFilter[a,b], /visit2=checkAuthenticatedFilter[c,d]这个是我debug时看到的,可以发现他是将换行符变为了分隔符,然后将等号变为了key和value的标记。然后调用生成的DefaultFilterChainManager 。