spring boot shiro结合使用,filterchain的问题

java10001 发布于 2014/12/02 11:39
阅读 10K+
收藏 1

我这边用spring boot搭建了一套东西,其中用到了shiro,

但是我在springboot与shiro配合过程中发现,一个问题:

我在boot上声明的filter比如:MyUserfilter(继承Userfilter)

然后shirofilter配置如下: /** = user

我跟踪代码发现,shiro的filterchain会首先经过一次shirofilter chain

再经过一次容器的filterchain,

那么问题就出现在容器把我定义的MyUserfilter也作为容器的filter接管,

所有的请求又都经过一次filter,导致一个问题出现,比如:

我定义 /css/**=anon, /js/**=anon, /** = user,那么所有css js等资源文件也会被拦截,

而这个情况在spring 非boot应用中并不出现,对此不知道大家有木有什么好的想法

加载中
0
魚魚
魚魚
扩展 OncePerRequestFilter ,保证只执行一次拦截器链。
0
java10001
java10001

引用来自“excavating”的评论

扩展 OncePerRequestFilter ,保证只执行一次拦截器链。
问题不是这个,UserFilter也是继承了OncePerRequestFilter,主要在于original filterchain执行上,我现在已经找了一个规避方法,后面我有时间的来好好研究一下spring boot和spring web在配置上区别
0
大陆土著

不知道你是用哪种方式配置, 是用SpringConfigBean ? 还是用XML? 其实这个问题的真正原因是定义了多个filter与shirofilter 一同被spring-boot 识别,加入了filterChain. 相当于myFilter与shiroFilter不再是上下级的关系,而是平级的关系,由spring ApplicationFilterConfig 一起管理了.

我这些天也遇到这个问题, 不过我是用的xml配置, 因为我的项目有一些本身的因素,暂时无法用springConfigureBean方式来处理,所以我还是用原来的spring shiro.xml来配置, 对于ConfigBean来说应该是一样的.

只需要改造一下, 将原来的那些 自定义的Fliter不要在外层Bean定义,直接放到filters的Map内层,如下见红色字体:

 <!-- Shiro的Web过滤器 -->
    <bean id="shiroFilter" class="com.skyroam.bsp.security.client.ClientShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="${client.login.url}"/>
        <property name="successUrl" value="${client.success.url}"/>
        <property name="unauthorizedUrl" value="${client.unauthorized.url}"/>
        <property name="filters">
            <util:map>
                <entry key="authc">
                    <bean class="com.sbc.security.client.login.ClientFormAuthenticationFilter">
                        <property name="remoteService" ref="remoteService"/>
                    </bean>
                </entry>
                <entry key="sessionUser">
                    <bean class="com.sbc.security.client.login.SessionUserFilter">
                        <property name="remoteService" ref="remoteService"/>
                    </bean>
                </entry>
            </util:map>
        </property>
        <property name="filterChainDefinitionsStr" value="${client.filter.chain.definitions}"/>
    </bean>

lion0108
lion0108
你好,我现在使用boot也碰到了这个问题,请问除了您说的那么方案还有什么其他的方案来解决吗?
0
j
javaDB

通过new 对象,注入即可。

 ForceLogoutFilterV0 forceLogout = new ForceLogoutFilterV0();
        forceLogout.setForceUrl("http://127.0.0.1:8080/forceLogin.jsp");
        forceLogout.setSysConfigParam("isRefuseLogin");
    CasFilter casFilter = new CasFilter();
    casFilter.setFailureUrl("/casFailure.jsp");
   
        Map<String, Filter> filters = new HashMap<String,Filter>();
        filters.put("cauthc", new CasFormAuthenticationFilter());
filters.put("roleOrFilter", new RolesOrFilter());
filters.put("forceLogout", forceLogout);
filters.put("cas", casFilter);

bean.setFilters(filters);

0
l
luzuoqi

我也碰到问题,后来搜索外网,发现自定义的Fliter也可以通过@Bean的方式注入,毕竟自定义的filter也有要用到其他spring容器托管的bean的时候,如果在map里直接new filter,filter是无法注入其他bean的。

只需要一点,@Bean定义自定义的bean的顺序,要放在ShiroFilterFactoryBean之后定义,试过了可行。参考这里的,http://richardadams606blog.blogspot.co.uk/2014/10/apache-shiro-and-spring-boot.html

骑着蜗牛的小花生
骑着蜗牛的小花生
怎么打不开链接呢,对于静态资源不拦截怎么处理呢?
0
大__大
大__大
public class ScheduledTaskJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
    private transient AutowireCapableBeanFactory beanFactory;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        beanFactory = applicationContext.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

 

new出来以后再做注入?类似上面这个quartz的处理方式?

 

 

 

 

0
wind风
wind风

引用来自“大陆土著”的评论

不知道你是用哪种方式配置, 是用SpringConfigBean ? 还是用XML? 其实这个问题的真正原因是定义了多个filter与shirofilter 一同被spring-boot 识别,加入了filterChain. 相当于myFilter与shiroFilter不再是上下级的关系,而是平级的关系,由spring ApplicationFilterConfig 一起管理了.

我这些天也遇到这个问题, 不过我是用的xml配置, 因为我的项目有一些本身的因素,暂时无法用springConfigureBean方式来处理,所以我还是用原来的spring shiro.xml来配置, 对于ConfigBean来说应该是一样的.

只需要改造一下, 将原来的那些 自定义的Fliter不要在外层Bean定义,直接放到filters的Map内层,如下见红色字体:

 <!-- Shiro的Web过滤器 -->
    <bean id="shiroFilter" class="com.skyroam.bsp.security.client.ClientShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="${client.login.url}"/>
        <property name="successUrl" value="${client.success.url}"/>
        <property name="unauthorizedUrl" value="${client.unauthorized.url}"/>
        <property name="filters">
            <util:map>
                <entry key="authc">
                    <bean class="com.sbc.security.client.login.ClientFormAuthenticationFilter">
                        <property name="remoteService" ref="remoteService"/>
                    </bean>
                </entry>
                <entry key="sessionUser">
                    <bean class="com.sbc.security.client.login.SessionUserFilter">
                        <property name="remoteService" ref="remoteService"/>
                    </bean>
                </entry>
            </util:map>
        </property>
        <property name="filterChainDefinitionsStr" value="${client.filter.chain.definitions}"/>
    </bean>

 

我用springboot进行配置,也遇到过这样的坑,感谢帮我解决问题,纠结一两天了

0
宏世界
宏世界

感觉还是没有说清楚,我现在springboot整合shiro也遇到这个问题,请问有谁能回答springboot整合shiro出现的这种情况,上面讲的用xml放到内部去bean,这是springmvc的xml方式,springboot用的是java类的形式,该怎么去定义内部bean

 

_Hill3
_Hill3
http://www.hillfly.com/2017/179.html 我这个文章应该可以帮到你。
返回顶部
顶部