与应用程序隔离的 WildFly9 JASPI 模块
WildFly9 JASPI Module Isolated from Application
我正在尝试创建一个与我的 EAR 应用程序完全隔离的自定义 JASPI ServerAuthModule。它依赖于 spring 框架 2.5.5 的遗留版本。我是 运行 WildFly 9.0.2.Final.
我定义了一个合适的安全域:
<security-domain="sample">
<authentication-jaspi>
<login-module-stack name="...">
<login-module code="..." flag="...">
<module-option name="..." value="..."/>
</login-module>
</login-module-stack>
<auth-module code="..." login-module-stack-ref="...">
<module-option name="..." value="..."/>
</auth-module>
</authentication-jaspi>
</security-domain>
然后为我的 Auth-Module 依赖项定义了一个自定义 JBoss 模块。
$WILDFLY/modules/com/my/module/main/module.xml
$WILDFLY/modules/com/my/module/main/spring-core-2.5.5.jar
$WILDFLY/modules/com/my/module/main/etc.jar (..)
然后我将我的模块挂钩为纠察箱依赖项。
cat $WILDFLY/system/layers/base/modules/org/picketbox/main/module.xml
<module xmlnx="..." name="org.picketbox">
...
<dependency>
...
<module name="org.my.module" />
</dependency>
</module>
当我尝试部署一个通用 my-app.ear
时 my-app.war
和 jboss-web.xml
指向 "sample" 安全域,它成功找到 classes 我想要的,开始 JASPI 生命周期,但是当它开始创建 Spring 上下文和 Spring Beans 时,它落在 my-app.ear.my-app.war
模块类加载器上,并且正如预期的那样找不到 classes.
ClassNotFoundException: com.my.module.ClassX from [Module "deployment.my-app.ear.my-app.war:main" from Service Module Loader]
我不想将 com.my.module
添加为 jboss-deployment-structure.xml
中的依赖项。这样做会使应用程序按预期工作。虽然我需要它隔离。
我的问题是:
- 是否可以将 JASPI 模块 classes 从我的应用程序中分离出来?
- 是否推荐这种方法(挂钩为
org.picketbox
依赖项)?
- 这是 Spring Framework 2.5.5 的限制吗?也许它使用的是 Current Thread class 加载器以外的类加载器。
提前致谢。
我发现了一个有趣的指南,它向我们解释了很多关于 JBoss 模块和 Class 加载问题的内容。
此处:https://developer.jboss.org/wiki/ModuleCompatibleClassloadingGuide
它说 TCCL 在某些情况下可能是癌症。
我发现遗留 Spring 2.5.5 使用 TCCL 加载 类 并实例化它的 bean。
为了纠正这种行为,我扩展了 ClassPathXmlApplicationContext
并覆盖了最初从 TCCL (ClassUtils.getDefaultClassLoader
) 获得的 getClassLoader()
。
一切都开始工作,与主应用程序隔离。问题已解决。
如果有人试图执行一些孤立的模块实现并获得奇怪的行为,我建议从您的底层框架开始怀疑。
将 JASPIC 模块 (SAM) 与您的应用程序隔离开来的另一种方法是将其部署为单独的 war。
这可以通过使用编程选项注册 SAM 来完成,但要为应用程序上下文 ID 传递 null
。然后,SAM 将可用于部署在同一 AS 上的所有其他存档。
我正在尝试创建一个与我的 EAR 应用程序完全隔离的自定义 JASPI ServerAuthModule。它依赖于 spring 框架 2.5.5 的遗留版本。我是 运行 WildFly 9.0.2.Final.
我定义了一个合适的安全域:
<security-domain="sample">
<authentication-jaspi>
<login-module-stack name="...">
<login-module code="..." flag="...">
<module-option name="..." value="..."/>
</login-module>
</login-module-stack>
<auth-module code="..." login-module-stack-ref="...">
<module-option name="..." value="..."/>
</auth-module>
</authentication-jaspi>
</security-domain>
然后为我的 Auth-Module 依赖项定义了一个自定义 JBoss 模块。
$WILDFLY/modules/com/my/module/main/module.xml
$WILDFLY/modules/com/my/module/main/spring-core-2.5.5.jar
$WILDFLY/modules/com/my/module/main/etc.jar (..)
然后我将我的模块挂钩为纠察箱依赖项。
cat $WILDFLY/system/layers/base/modules/org/picketbox/main/module.xml
<module xmlnx="..." name="org.picketbox">
...
<dependency>
...
<module name="org.my.module" />
</dependency>
</module>
当我尝试部署一个通用 my-app.ear
时 my-app.war
和 jboss-web.xml
指向 "sample" 安全域,它成功找到 classes 我想要的,开始 JASPI 生命周期,但是当它开始创建 Spring 上下文和 Spring Beans 时,它落在 my-app.ear.my-app.war
模块类加载器上,并且正如预期的那样找不到 classes.
ClassNotFoundException: com.my.module.ClassX from [Module "deployment.my-app.ear.my-app.war:main" from Service Module Loader]
我不想将 com.my.module
添加为 jboss-deployment-structure.xml
中的依赖项。这样做会使应用程序按预期工作。虽然我需要它隔离。
我的问题是:
- 是否可以将 JASPI 模块 classes 从我的应用程序中分离出来?
- 是否推荐这种方法(挂钩为
org.picketbox
依赖项)? - 这是 Spring Framework 2.5.5 的限制吗?也许它使用的是 Current Thread class 加载器以外的类加载器。
提前致谢。
我发现了一个有趣的指南,它向我们解释了很多关于 JBoss 模块和 Class 加载问题的内容。
此处:https://developer.jboss.org/wiki/ModuleCompatibleClassloadingGuide
它说 TCCL 在某些情况下可能是癌症。
我发现遗留 Spring 2.5.5 使用 TCCL 加载 类 并实例化它的 bean。
为了纠正这种行为,我扩展了 ClassPathXmlApplicationContext
并覆盖了最初从 TCCL (ClassUtils.getDefaultClassLoader
) 获得的 getClassLoader()
。
一切都开始工作,与主应用程序隔离。问题已解决。
如果有人试图执行一些孤立的模块实现并获得奇怪的行为,我建议从您的底层框架开始怀疑。
将 JASPIC 模块 (SAM) 与您的应用程序隔离开来的另一种方法是将其部署为单独的 war。
这可以通过使用编程选项注册 SAM 来完成,但要为应用程序上下文 ID 传递 null
。然后,SAM 将可用于部署在同一 AS 上的所有其他存档。