我正在尝试创建一个与我的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
指向“示例”安全域的公共my-app.ear.my-app.war
时,它会成功找到我想要的类,启动JASPI生命周期,但是当它开始创建Spring Context和Spring Beans时,它会落在com.my.module
模块类加载器上,并且正如预期的那样找不到类。
ClassNotFoundException:来自[Module“deployment.my-app.ear.my-app.war:main”来自Service Module Loader的com.my.module.ClassX
我不想在jboss-deployment-structure.xml
中添加org.picketbox
作为依赖项。这样做可以使应用程序按需运行。虽然我需要它隔离。
我的问题是:
parseFloat
依赖)?提前致谢。
答案 0 :(得分:1)
我找到了一个有趣的指南,它解释了我们很多关于JBoss模块和类加载问题的内容。
此处:https://developer.jboss.org/wiki/ModuleCompatibleClassloadingGuide
它说TCCL在某些情况下可能是癌症。
我发现传统的Spring 2.5.5使用TCCL来加载类并实例化它的bean。
为了纠正这种情况,我延长了ClassPathXmlApplicationContext
并覆盖了最初来自TCCL(getClassLoader()
)的ClassUtils.getDefaultClassLoader
。
一切都开始起作用,与主应用程序隔离。问题解决了。
如果有人试图做一些孤立的模块实现并且得到奇怪的行为,我建议从你的底层框架开始怀疑。
答案 1 :(得分:1)
将JASPIC模块(SAM)与应用程序隔离的另一个选择是将其部署为单独的战争。
这可以通过使用编程选项注册SAM来完成,但是为应用程序上下文ID传递null
。然后,SAM将可用于部署在同一AS上的所有其他存档。