当前位置: 首页 > news >正文

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

1. 创建过程

  1. 新建一个Shiro,去github上查看simple,需要用到哪些内容;
  2. 根据显示的内容,在创建项目的时候导入SpringWeb,Thymeleaf
  3. 检查pom.xml,确定导入的内容是最新的自己想要的SpringBoot3.5.4 的最新版。
  4. 在themleaf创建个首页,编写一个controller,测试springboot项目正常启动
  5. 使用的Springboot3.x,所以在github的Shiro仓库中参照:https://github.com/apache/shiro/tree/main/samples/spring-boot-3-web
  6. 引入git的pom.xml的依赖
        <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>2.0.0-alpha-4</version><classifier>jakarta</classifier></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>2.0.0-alpha-4</version><classifier>jakarta</classifier></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>2.0.0-alpha-4</version><classifier>jakarta</classifier></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>2.0.0-alpha-4</version><classifier>jakarta</classifier></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>2.0.0-alpha-4</version><classifier>jakarta</classifier></dependency>
  1. 编写Configuration 参照samples/spring-boot-3-web/src/main/java/org/apache/shiro/samples/WebApp.java
package com.demo.config;import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.TextConfigurationRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Apache Shiro 核心配置类* 用于集成 Shiro 权限框架到 Spring Boot 3.x 应用*/
@Configuration
public class ShiroConfig {/*** 创建并配置Realm Bean用于权限管理** @return 配置好的TextConfigurationRealm实例*/@Beanpublic Realm realm() {TextConfigurationRealm realm = new TextConfigurationRealm();// 配置用户及其对应的权限角色// 配置用户:格式为 username = password, role1, role2, ...realm.setUserDefinitions("admin=admin,admin,manager,user\n"+ "manager=manager,manager,user\n"+ "user=user,user");// 配置角色及其关系 这里不是“角色继承”,而是“角色拥有的权限”// 配置角色权限(可选):格式为 role = permission1, permission2, ...realm.setRoleDefinitions("admin=*:*:*\n"+ "manager=read:write\n"+ "user=read");return realm;}/*** 配置 Shiro 过滤器链* 定义哪些路径需要什么样的过滤器(权限控制)** @return ShiroFilterChainDefinition 实例*/@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();// /login 路径允许匿名访问(anon),即未登录用户也可以访问,用于登录页面或登录接口。chainDefinition.addPathDefinition("/login", "anon");// 访问 /logout 需要登出(logout),即用户可登出。chainDefinition.addPathDefinition("/logout", "logout");// 访问根路径 / 需要认证(authc),即用户必须已登录才可访问。chainDefinition.addPathDefinition("/**", "authc");return chainDefinition;}/*** 【关键】配置 SecurityManager* 这是 Shiro 的核心,必须显式声明为 Bean* shiro-spring-boot-starter 会自动使用这个 Bean** @param realm 从 Spring 容器注入的 Realm* @return 配置好的 SecurityManager*/@Beanpublic DefaultWebSecurityManager  securityManager(Realm realm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager ();securityManager.setRealm(realm);return securityManager;}}
  1. 期间一直报错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,
image
因为SecurityManager是已经被废止的对象,原本想使用上级对象,但是发现其实返回的也是 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager ();,所以使用了DefaultWebSecurityManager 补充后重新测试,程序能正常加载
image

http://www.sczhlp.com/news/10923/

相关文章:

  • 优先级调度器和`时间轮`调度器
  • golang elastic search操作示例
  • xaml在线设计
  • 小白指南(三)——在Windows系统上安装minio存储系统
  • matlab实现利用双MZI产生RZ33-QPSK信号
  • 杂题做题日志
  • 自动驾驶 HIL 测试:构建 以假乱真 的实时数据注入系统
  • 牛 CDR3 单抗的开发难点与技术优化
  • 跨网文件传输系统:突破限制,以卓越传输能力护航数据流通!
  • 供应商协同平台如何实现供应链协作效率提升300%?
  • 2025年最新项目管理工具十强:国产化与智能化双轨革新
  • Chrome 下载文件时总是提示“已阻止不安全的下载”的解决方案
  • Codeforces 2007B Index and Maximum Value 题解 [ 橙 ] [ Ad-hoc ] [ 线段树 ] [ 平衡树 ]
  • C#自学笔记:预处理指令
  • 读书笔记:卡片笔记写作法
  • kettle插件-kettle http post plus插件失灵了?继续迭代优化轻松调用公卫高安全系数接口
  • 华为_NAT
  • 发电
  • 华为
  • dp11
  • js字符串内插
  • echarts免费的地址
  • 高级SQL语法问题
  • 【IEEE出版】第五届机械制造与智能控制国际学术会议(ICMMIC 2025)
  • 2025信友队暑假集训记录
  • 282、赤壁
  • 导航
  • Cheat Engine - Charlie
  • git怎么设置http代理服务器
  • 【高录用|快速见刊】第七届土木工程、环境资源与能源材料国际学术会议(CCESEM 2025)