【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 > |
以此备注。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步