几年前,为了在使用Mulesoft实现的一些流程中实现认证,我使用了Spring Security模块[5],效果令人满意。当然,我更希望Mulesoft能提供一个专用的组件来实现这个功能,但现有的组件无法在软件的Community Edition中使用,因此我不得不使用外部模块。
然而,这个组件一直运行良好,直到我需要将模块从版本1.3.6更新到更高版本,例如1.3.9。在该版本中,许多内容发生了变化,包括组件定义的格式,无法更新模块而不出现错误,而且在各个论坛中也找不到解决方案,反而建议不要更新组件[6][7][8][9]。
因此,我推迟了更新,直到迁移到新的Runtime(Mule Server),这时不得不面对并解决这个问题。

问题描述
简而言之,问题在于引入了在一个Security Manager中使用多个Security Providers的可能性,这两个组件以前是同级的,现在嵌套在一起。
之前:
<spring:config name="Spring_Config" doc:name="Spring Config" doc:id="zzzzzz" files="beans.xml" /> <spring:security-manager doc:name="Spring Security manager" doc:id="xxxxxxxxx" > <spring:delegate-security-provider name="auth-manager" delegate-ref="authenticationManager" /> </spring:security-manager>
之后:
<spring:config name="Spring_Config" doc:name="Spring Config" doc:id="zzzzzz" files="beans.xml" />
<spring:security-manager doc:name="Spring Security manager" doc:id="xxxxxxxxx">
<spring:delegate-security-providers>
<spring:delegate-security-provider name="auth-manager" delegate-ref="authenticationManager" />
</spring:delegate-security-providers>
</spring:security-manager>
然而,Software Anypoint Studio作为一个基于Eclipse的IDE,用于设计Mulesoft CE版本的流程,并未接受新语法,当使用新格式时会返回错误:
Element: delegate-security-provider is not allowed to be child of element Spring Security manager apiugovqueries.xml /apiugovqueries/src/main/mule Spring Security manager Message Flow Error
这个错误使得无法将Spring Security模块从最后一个可用版本1.3.6更新到任何后续版本。
问题解决
当需要升级到更高版本的Mulesoft的Runtime(所谓的core)时,尝试对系统进行全面更新似乎是明智的,包括Java、Runtime、Anypoint Studio、Spring Security和所有其他模块的最新版本。
根据官方网站上的兼容性表[10],我们决定进行以下更新:
| 产品 | 旧版本 | 新版本 |
| SDK Java | 1.8 | 17 |
| AnyPoint Studio | 7.20 | 7.22 |
| Runtime Mule Server | 4.5 | 4.9 |
| Spring Security | 1.3.6 | 2.1.1 |
此外,由于系统运行在Docker容器上,也需要更新它,但这可能是另一个帖子的主题,因为我打算将Docker生成的镜像集成到Helm Chart(用于Kubernetes部署的工具)中。
因此,遵循的步骤如下,首先一次性需要:
- 安装Oracle Java SDK 17[12]并相应修改系统的PATH和环境变量JAVA_HOME。
- 更新/安装Anypoint Studio到最新版本。
- 在Anypoint Studio中:在Window->Preferences->Java->Installed JREs中添加jdk 17。

然后,对于每个项目:
- 更新所有模块:右键点击项目名称->Properties->Mule Project->Modules。所有模块都更新到最新版本,特别是Spring Module更新到版本2.1.1。

- 仍在项目属性中:Properties->Java Compiler:
- 勾选“Enable project specific settings”。
- 设置Compiler compliance level = 17。
- 仍在项目属性中:Properties->Java Build Path->Libraries:
- 将JRE System Library版本设置为JDK 17。
- 将Mule Runtime Server版本设置为4.9.1。

- 确保Run Configuration(Run->Run configuration..)和Debug Configuration(Run->Debug Configuration…)使用正确版本的Java。

- 手动修改项目XML文件(Configuration XML)并替换以下定义:
<spring:config name="Spring_Config" doc:name="Spring Config" doc:id="zzzzzz" files="beans.xml" /> <spring:security-manager doc:name="Spring Security manager" doc:id="xxxxxxxxx" > <spring:delegate-security-provider name="auth-manager" delegate-ref="authenticationManager" /> </spring:security-manager>用如下定义(注意在新版本中保留原始版本的相同doc:id):
<spring:config name="Spring_Config" doc:name="Spring Config" doc:id="zzzzzz" files="beans.xml" /> <spring:security-manager doc:name="Spring Security manager" doc:id="xxxxxxxxx"> <spring:delegate-security-providers> <spring:delegate-security-provider name="auth-manager" delegate-ref="authenticationManager" /> </spring:delegate-security-providers> </spring:security-manager> - 在此过程结束时,项目的Global Elements应该如截图所示,Spring Security Manager中嵌套了一个auth-manager。

此配置目前在生产中运行良好。
结论
我认为最终是AnyPoint Studio的更新解决了问题,但最新版本的Spring模块确实需要更新的Runtime,而这又需要更新的Java版本。因此,决定更新整个系统并不困难。
最好是Mulesoft CE中包含一个用于管理认证的组件,但遗憾的是没有。
一种可能性是在流程中手动验证HTTP头并检查Basic Authentication或Token,实际上,将来可能会考虑以这种方式操作并消除对Spring的依赖。
来源和参考
- Mulesoft,官方网站。
- 下载Mule Kernel,官方网站。
- 下载、安装、配置和升级Mule,官方网站。
- 下载和安装Anypoint Studio,官方网站。
- 使用Spring Security进行组件授权,官方文档。
- 如何解决错误:“delegate-security-provider is not allowed to be child of element Spring Security manager”,Mulesoft社区论坛。
- 在Mule 4项目中使用spring 1.3.9进行基本认证时出错,Mulesoft社区论坛。
- 在Mule CE 4.50实现的流程中添加基本认证的最佳方式是什么?,Mulesoft社区论坛。
- 多个spring:delegate-security-provider元素在studio中导致验证错误,官方文档。
- Mule Runtime Java支持,官方文档。
- 在Slack频道讨论,搜索“which is the best way to add the Basic Authentication to a flow ”在#technical-questions。
- Java SE 17 Archive Downloads,Oracle官方网站。
- Java Adoptium镜像,官方网站。
*** 注意:本文通过使用n8n和OpenAI的自动流程翻译。

