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