原文链接:https://tidyko.com/posts/b014d2be.html

 

使用@Configuration配置shiro无状态登录时出现的问题,在subject.login之后当前线程重新绑定了一个假定subject,isAuthenticated。

这里自定义的访问拦截器的创建需要放在shiroFilter之后,如下:

 /**
  * Shiro 的 Web 过滤器链
  */
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter() {
    ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
    filter.setSecurityManager(securityManager());

    Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
    // 无状态授权器
    filters.put("statelessAuthc", statelessAuthcFilter());
    filter.setFilters(filters);

    /**
     * 配置shiro拦截器链
     */
    // filterChainDefinitionMap 必须是 LinkedHashMap 因为它必须保证有序
    Map<String, String> chain = new LinkedHashMap<String, String>();
    // anon-表示可以匿名访问, authc-表示需要认证才可以访问
    // 因为禁用了 Session,所以这里不能使用 authc 了,否则会报 DisabledSessionException 异常
    chain.put("/services/*", "statelessAuthc");
    chain.put("/**", "anon");
    filter.setFilterChainDefinitionMap(chain);
    return filter;
}
    
// 访问控制过滤器
// <bean />

@Bean
public AccessControlFilter statelessAuthcFilter() {
    return new StatelessAccessControlFilter();
}

  

如果使用xml配置是不需要注意前后位置的

<bean />

<!-- Shiro的Web过滤器 -->
<bean >
    <property name="securityManager" ref="securityManager"/>
    <property name="filters">
        <util:map>
            <entry key="statelessAuthc" value-ref="statelessAuthcFilter"/>
        </util:map>
    </property>
    <property name="filterChainDefinitions">
        <value>
            /services/*=statelessAuthc
            /**=anon
        </value>
    </property>
</bean>

 

以此备注。

相关文章:

  • 2021-05-26
  • 2021-06-29
  • 2021-11-18
  • 2021-07-03
  • 2022-03-02
  • 2021-11-11
  • 2021-11-19
猜你喜欢
  • 2022-12-23
  • 2021-10-31
  • 2021-08-06
  • 2022-12-23
  • 2021-05-21
  • 2021-08-27
  • 2021-05-26
相关资源
相似解决方案