Java 与应用程序隔离的WildFly9 JASPI模块

Java 与应用程序隔离的WildFly9 JASPI模块,java,spring,jboss,wildfly-9,jaspic,Java,Spring,Jboss,Wildfly 9,Jaspic,我正在尝试创建一个与EAR应用程序完全隔离的定制JASPIServerAuthModule。它依赖于SpringFramework 2.5.5的旧版本。我正在运行WildFly 9.0.2.Final 我定义了一个适当的安全域: <security-domain="sample"> <authentication-jaspi> <login-module-stack name="..."> <login-mod

我正在尝试创建一个与EAR应用程序完全隔离的定制JASPIServerAuthModule。它依赖于SpringFramework 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>
然后,我将我的模块作为一个picketbox依赖项挂接

cat $WILDFLY/system/layers/base/modules/org/picketbox/main/module.xml

<module xmlnx="..." name="org.picketbox">
   ...
   <dependency>
      ...
      <module name="org.my.module" />
   </dependency>
</module>
cat$WILDFLY/system/layers/base/modules/org/picketbox/main/module.xml
...
...
当我尝试部署一个通用的
my app.ear
时,它将
my app.war
jboss web.xml
一起提供,指向“sample”安全域,它成功地找到了我想要的类,启动了JASPI生命周期,但是,当它开始创建Spring上下文和SpringBeans时,它落在
myapp.ear.myapp.war
模块类加载器上,并且正如预期的那样没有找到类

ClassNotFoundException:com.my.module.ClassX来自服务模块加载器的[module“deployment.my app.ear.my app.war:main]

我不想在
jboss deployment structure.xml
中添加
com.my.module
作为依赖项。这样做可以使应用程序按预期工作。虽然我需要隔离

我的问题是:

  • 可以从我的应用程序中隔离JASPI模块类吗
  • 是否推荐这种方法(挂接为
    org.picketbox
    dependency)
  • 它是SpringFramework 2.5.5的限制吗?可能它使用的类加载器不是当前的线程类加载器

提前感谢。

我找到了一本有趣的指南,它向我们解释了很多关于JBoss模块和类加载的问题

在这里:

它说TCCL在某些情况下可能是一种癌症

我发现旧式Spring2.5.5使用TCCL加载类并实例化其bean

为了纠正这种行为,我扩展了
ClassPathXmlApplicationContext
并重写了最初从TCCL(
ClassUtils.getDefaultClassLoader
)获取的
getClassLoader()

一切都开始工作,与主应用程序隔离。问题解决了


如果有人试图执行一些独立的模块实现,并出现奇怪的行为,我建议从底层框架开始怀疑。

另一种将JASPIC模块(SAM)与应用程序隔离的方法是将其作为单独的war进行部署


这可以通过使用编程选项注册SAM来完成,但要为应用程序上下文ID传递一个
null
。然后SAM将可用于部署在同一服务器上的所有其他存档。

如果这解决了您的问题,您应该检查✔ 在你的问题旁边。
cat $WILDFLY/system/layers/base/modules/org/picketbox/main/module.xml

<module xmlnx="..." name="org.picketbox">
   ...
   <dependency>
      ...
      <module name="org.my.module" />
   </dependency>
</module>