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 。

 

相关推荐