【Shiro】調用doGetAuthenticationInfo進行認證成功之后,isAuthenticated是false的問題。


原文鏈接: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 id="authcFilter" class="cn.tisson.upms.client.shiro.filter.StatelessAccessControlFilter"/>

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

  

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

<bean id="statelessAuthcFilter" class="cn.tisson.upms.client.shiro.filter.UpmsStatelessAuthcFilter"/>

<!-- Shiro的Web過濾器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <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>

 

以此備注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM