MuleSoft CE: 更新 Spring Security 认证模块

几年前,为了在使用Mulesoft实现的一些流程中实现认证,我使用了Spring Security模块[5],效果令人满意。当然,我更希望Mulesoft能提供一个专用的组件来实现这个功能,但现有的组件无法在软件的Community Edition中使用,因此我不得不使用外部模块。

然而,这个组件一直运行良好,直到我需要将模块从版本1.3.6更新到更高版本,例如1.3.9。在该版本中,许多内容发生了变化,包括组件定义的格式,无法更新模块而不出现错误,而且在各个论坛中也找不到解决方案,反而建议不要更新组件[6][7][8][9]

因此,我推迟了更新,直到迁移到新的RuntimeMule 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更新到任何后续版本。

问题解决

当需要升级到更高版本的MulesoftRuntime(所谓的core)时,尝试对系统进行全面更新似乎是明智的,包括JavaRuntimeAnypoint StudioSpring 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部署的工具)中。

因此,遵循的步骤如下,首先一次性需要:

  1. 安装Oracle Java SDK 17[12]并相应修改系统的PATH和环境变量JAVA_HOME
  2. 更新/安装Anypoint Studio到最新版本。
  3. Anypoint Studio中:在Window->Preferences->Java->Installed JREs中添加jdk 17

然后,对于每个项目:

  1. 更新所有模块:右键点击项目名称->Properties->Mule Project->Modules。所有模块都更新到最新版本,特别是Spring Module更新到版本2.1.1
  2. 仍在项目属性中:Properties->Java Compiler
    • 勾选“Enable project specific settings”。
    • 设置Compiler compliance level = 17
  3. 仍在项目属性中:Properties->Java Build Path->Libraries:
    1. JRE System Library版本设置为JDK 17
    2. Mule Runtime Server版本设置为4.9.1
  4. 确保Run ConfigurationRun->Run configuration..)和Debug ConfigurationRun->Debug Configuration…)使用正确版本的Java
  5. 手动修改项目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>
  6. 在此过程结束时,项目的Global Elements应该如截图所示,Spring Security Manager中嵌套了一个auth-manager。

此配置目前在生产中运行良好。

结论

我认为最终是AnyPoint Studio的更新解决了问题,但最新版本的Spring模块确实需要更新的Runtime,而这又需要更新的Java版本。因此,决定更新整个系统并不困难。

最好是Mulesoft CE中包含一个用于管理认证的组件,但遗憾的是没有。

一种可能性是在流程中手动验证HTTP头并检查Basic AuthenticationToken,实际上,将来可能会考虑以这种方式操作并消除对Spring的依赖。

来源和参考

  1. Mulesoft,官方网站。
  2. 下载Mule Kernel,官方网站。
  3. 下载、安装、配置和升级Mule,官方网站。
  4. 下载和安装Anypoint Studio,官方网站。
  5. 使用Spring Security进行组件授权,官方文档。
  6. 如何解决错误:“delegate-security-provider is not allowed to be child of element Spring Security manager”,Mulesoft社区论坛。
  7. 在Mule 4项目中使用spring 1.3.9进行基本认证时出错,Mulesoft社区论坛。
  8. 在Mule CE 4.50实现的流程中添加基本认证的最佳方式是什么?,Mulesoft社区论坛。
  9. 多个spring:delegate-security-provider元素在studio中导致验证错误,官方文档。
  10. Mule Runtime Java支持,官方文档。
  11. Slack频道讨论,搜索“which is the best way to add the Basic Authentication to a flow ”在#technical-questions
  12. Java SE 17 Archive Downloads,Oracle官方网站。
  13. Java Adoptium镜像,官方网站。

 

*** 注意:本文通过使用n8n和OpenAI的自动流程翻译。

6 months ago

Leave a Reply

Your email address will not be published. Required fields are marked *

评论审核已启用。您的评论可能需要一段时间后才能被显示。