找回密码
 立即注册
首页 业界区 安全 SpringBoot3.5.4 整合Shiro时 运行失败,检查思路及最终 ...

SpringBoot3.5.4 整合Shiro时 运行失败,检查思路及最终解决方案

冈欤寨 2025-8-13 09:54:09
1. 创建过程


  • 新建一个Shiro,去github上查看simple,需要用到哪些内容;
  • 根据显示的内容,在创建项目的时候导入SpringWeb,Thymeleaf
  • 检查pom.xml,确定导入的内容是最新的自己想要的SpringBoot3.5.4 的最新版。
  • 在themleaf创建个首页,编写一个controller,测试springboot项目正常启动
  • 使用的Springboot3.x,所以在github的Shiro仓库中参照:https://github.com/apache/shiro/tree/main/samples/spring-boot-3-web
  • 引入git的pom.xml的依赖
  1.         <dependency>
  2.             <groupId>org.apache.shiro</groupId>
  3.             shiro-core</artifactId>
  4.             <version>2.0.0-alpha-4</version>
  5.             <classifier>jakarta</classifier>
  6.         </dependency>
  7.         <dependency>
  8.             <groupId>org.apache.shiro</groupId>
  9.             shiro-web</artifactId>
  10.             <version>2.0.0-alpha-4</version>
  11.             <classifier>jakarta</classifier>
  12.         </dependency>
  13.         
  14.         <dependency>
  15.             <groupId>org.apache.shiro</groupId>
  16.             shiro-spring-boot-web-starter</artifactId>
  17.             <version>2.0.0-alpha-4</version>
  18.             <classifier>jakarta</classifier>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>org.apache.shiro</groupId>
  22.             shiro-spring-boot-starter</artifactId>
  23.             <version>2.0.0-alpha-4</version>
  24.             <classifier>jakarta</classifier>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.apache.shiro</groupId>
  28.             shiro-spring</artifactId>
  29.             <version>2.0.0-alpha-4</version>
  30.             <classifier>jakarta</classifier>
  31.         </dependency>
复制代码

  • 编写Configuration 参照samples/spring-boot-3-web/src/main/java/org/apache/shiro/samples/WebApp.java
  1. package com.demo.config;
  2. import org.apache.shiro.mgt.DefaultSecurityManager;
  3. import org.apache.shiro.realm.Realm;
  4. import org.apache.shiro.realm.text.TextConfigurationRealm;
  5. import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
  6. import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
  7. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. /**
  11. * Apache Shiro 核心配置类
  12. * 用于集成 Shiro 权限框架到 Spring Boot 3.x 应用
  13. */
  14. @Configuration
  15. public class ShiroConfig {
  16.     /**
  17.      * 创建并配置Realm Bean用于权限管理
  18.      *
  19.      * @return 配置好的TextConfigurationRealm实例
  20.      */
  21.     @Bean
  22.     public Realm realm() {
  23.         TextConfigurationRealm realm = new TextConfigurationRealm();
  24.         // 配置用户及其对应的权限角色
  25.         // 配置用户:格式为 username = password, role1, role2, ...
  26.         realm.setUserDefinitions(
  27.                 "admin=admin,admin,manager,user\n"
  28.                         + "manager=manager,manager,user\n"
  29.                         + "user=user,user");
  30.         // 配置角色及其关系 这里不是“角色继承”,而是“角色拥有的权限”
  31.         // 配置角色权限(可选):格式为 role = permission1, permission2, ...
  32.         realm.setRoleDefinitions(
  33.                   "admin=*:*:*\n"
  34.                 + "manager=read:write\n"
  35.                 + "user=read"
  36.         );
  37.         return realm;
  38.     }
  39.     /**
  40.      * 配置 Shiro 过滤器链
  41.      * 定义哪些路径需要什么样的过滤器(权限控制)
  42.      *
  43.      * @return ShiroFilterChainDefinition 实例
  44.      */
  45.     @Bean
  46.     public ShiroFilterChainDefinition shiroFilterChainDefinition() {
  47.         DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
  48.         // /login 路径允许匿名访问(anon),即未登录用户也可以访问,用于登录页面或登录接口。
  49.         chainDefinition.addPathDefinition("/login", "anon");
  50.         // 访问 /logout 需要登出(logout),即用户可登出。
  51.         chainDefinition.addPathDefinition("/logout", "logout");
  52.         // 访问根路径 / 需要认证(authc),即用户必须已登录才可访问。
  53.         chainDefinition.addPathDefinition("/**", "authc");
  54.         return chainDefinition;
  55.     }
  56.     /**
  57.      * 【关键】配置 SecurityManager
  58.      * 这是 Shiro 的核心,必须显式声明为 Bean
  59.      * shiro-spring-boot-starter 会自动使用这个 Bean
  60.      *
  61.      * @param realm 从 Spring 容器注入的 Realm
  62.      * @return 配置好的 SecurityManager
  63.      */
  64.     @Bean
  65.     public DefaultWebSecurityManager  securityManager(Realm realm) {
  66.         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager ();
  67.         securityManager.setRealm(realm);
  68.         return securityManager;
  69.     }
  70. }
复制代码
问题点


  • 期间一直报错java.lang.IllegalStateException,ClassNotFoundException,多方查找资料后发现是因为 Shiro 和 Spring Boot 版本不兼容导致的。是一个典型的 Jakarta EE 9+ 迁移问题,其中 javax.servlet 包被重命名为 jakarta.servlet
思路及解决方案

网络上提出的解决方案有下面几种
1. 降级 Spring Boot 版本,降到SpringBoot 2.x 使用javax.servlet的那个版本,因为本身想根据视频中的思路,学习最新的知识。故而pass;
2. 升级 Shiro 版本,目前所使用的版本就是直接从github上查找所取下来的最新版的master版本,2.0.0-alpha-4,所以不存在不是最新的版的情况,先放一边;
3. 添加 Jakarta Servlet API 兼容性依赖,添加一个桥接的依赖包,使Javax和Jakarta整合,合理;
使用上述方式意义尝试后,依旧提示有问题,又去通义上让AI给写一个Shiro的整合方案,检查后发现少注入的一个SecurityManager,
1.png

因为SecurityManager是已经被废止的对象,原本想使用上级对象,但是发现其实返回的也是  DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager ();,所以使用了DefaultWebSecurityManager 补充后重新测试,程序能正常加载
2.png


来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册