原文鏈接: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>
以此備注。