Spring Boot集成Apache Shiro时/admin/**路径授权拦截不生效问题
问题原因分析
- 核心原因1:Shiro过滤器链使用
LinkedHashMap存储规则,相同路径Key的配置会被后写入的内容覆盖。你先后两次对/admin/**路径执行put操作,后写入的authc规则直接覆盖了之前的perms[admin:manage]规则,导致权限校验规则完全失效。这也是为什么你单独配置精准路径/admin/index的perms规则能生效的原因——精准路径配置在/admin/**的authc规则前面,不会被覆盖,能正常匹配。 - 核心原因2:Shiro过滤器链匹配逻辑是从上到下按顺序匹配,匹配到第一个符合的规则就终止匹配,不会继续往下匹配更精准的规则。你没有把
/admin/login这类不需要权限的路径提前排除,会导致登录相关接口被权限规则拦截,无法正常访问。
解决方案
调整过滤器链配置顺序,遵循「排除路径在前、通用规则在后,相同路径多规则合并配置」的原则:
- 提前把所有不需要认证和权限的/admin下的路径配置为
anon - 把
/admin/**的认证和权限规则合并为同一条配置,多个过滤器用逗号分隔
修改后的配置代码如下:
@Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager); bean.setLoginUrl("/admin/login"); bean.setUnauthorizedUrl("/"); Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>(); // 静态资源放行 filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/images/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/lib/**", "anon"); filterChainDefinitionMap.put("/", "anon"); // 登录相关路径提前放行 filterChainDefinitionMap.put("/admin", "anon"); filterChainDefinitionMap.put("/admin/login", "anon"); // 合并/admin/**的认证+权限规则,不要分开两次put同一个key filterChainDefinitionMap.put("/admin/**", "authc, perms[admin:manage]"); filterChainDefinitionMap.put("/**", "anon"); bean.setFilterChainDefinitionMap(filterChainDefinitionMap); return bean; }
调整后不需要再单独配置/admin/index的权限规则,/admin/**的通配规则就能正常生效,所有/admin下除了提前放行的登录相关路径,都会先校验登录状态,再校验admin:manage权限。
内容的提问来源于stack exchange,提问作者Henry Zhang
相关产品推荐
相关产品推荐

