最稳做法是排除spring security自动配置,引入shiro-spring-boot-web-starter,shirofilterfactorybean方法名必须为shirofilterfactorybean,权限字符串大小写敏感,jwt需自定义authenticatingfilter,注解驱动需@enableshiroannotations。

Shiro 依赖怎么加才不会和 Spring Boot 冲突
Spring Boot 2.5+ 默认用 Spring Security,直接加 shiro-spring-boot-starter 容易触发自动配置冲突,比如 ShiroAutoConfiguration 和 SecurityAutoConfiguration 抢着注册 Filter。最稳的做法是关掉 Spring Security 的自动配置,而不是删掉它。
- 在
application.yml里加:spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration - 只引入核心依赖:
shiro-spring-boot-web-starter(注意不是shiro-spring-boot-starter,后者不含 Web 支持) - 别同时引入
shiro-core和shiro-web手动管理版本——starter 已封装好依赖树,手动加反而容易引发NoClassDefFoundError: org/apache/shiro/web/filter/authc/AuthenticationFilter
ShiroFilterFactoryBean 配置写在哪、怎么写才生效
这个 Bean 必须声明为 @Bean 方法返回值,且方法名必须是 shiroFilterFactoryBean(Spring Boot Starter 会按这个名字查找),否则 Shiro 不接管请求链路。
- 路径匹配顺序很重要:从上到下匹配,
/**必须放最后,否则/login、/logout等路径会被提前拦截 - 权限字符串大小写敏感:
perms["user:delete"]和perms["USER:DELETE"]是两个不同权限 - 记住我(RememberMe)要显式开启:
filterMap.put("authc", new FormAuthenticationFilter());并设置setRememberMeParam("rememberMe")
Realm 中 doGetAuthorizationInfo 返回空权限的常见原因
登录成功但访问受限,大概率是 doGetAuthorizationInfo 没返回有效 SimpleAuthorizationInfo,而不是认证失败。
- 检查
subject.hasRole("admin")是否真的调用了你重写的 Realm —— 如果用了多个 Realm,得确认ModularRealmAuthorizer的策略是否设为AtLeastOneSuccessfulStrategy - 权限数据没加载进来:数据库查出来的是
List<string></string>,但忘了调用authorizationInfo.addStringPermissions(permissions) - 缓存干扰:启用了
AuthorizationCache后,权限变更不会自动失效,需手动调用clearCachedAuthorizationInfo(principals)
Shiro + JWT 场景下如何绕过表单登录流程
JWT 场景不走 FormAuthenticationFilter,得自定义一个继承 AuthenticatingFilter 的过滤器,否则所有请求都会被重定向到 /login.jsp。
立即学习“Java免费学习笔记(深入)”;
- 在
shiroFilterFactoryBean的 filterMap 中注册新 Filter:filterMap.put("jwt", new JwtFilter()); -
JwtFilter要重写isAccessAllowed,解析 Header 里的Bearer xxx,校验签名并 setSubject,再 return true - 别在
onLoginSuccess里调用subject.login(token)—— JWT 是无状态的,登录动作只发生在网关或鉴权服务端,这里只需验证
ShiroFilter 时,不是 Controller 层;很多人在 Controller 里加 @RequiresPermissions 却没生效,其实是没意识到注解驱动需要 @EnableShiroAnnotations 和 AOP 代理支持,而 Spring Boot Starter 默认不开启——这点最容易漏。










