You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Apache Shiro时/admin/**路径授权拦截不生效问题

问题原因分析
  • 核心原因1:Shiro过滤器链使用LinkedHashMap存储规则,相同路径Key的配置会被后写入的内容覆盖。你先后两次对/admin/**路径执行put操作,后写入的authc规则直接覆盖了之前的perms[admin:manage]规则,导致权限校验规则完全失效。这也是为什么你单独配置精准路径/admin/index的perms规则能生效的原因——精准路径配置在/admin/**的authc规则前面,不会被覆盖,能正常匹配。
  • 核心原因2:Shiro过滤器链匹配逻辑是从上到下按顺序匹配,匹配到第一个符合的规则就终止匹配,不会继续往下匹配更精准的规则。你没有把/admin/login这类不需要权限的路径提前排除,会导致登录相关接口被权限规则拦截,无法正常访问。
解决方案

调整过滤器链配置顺序,遵循「排除路径在前、通用规则在后,相同路径多规则合并配置」的原则:

  1. 提前把所有不需要认证和权限的/admin下的路径配置为anon
  2. 把/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:04