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