【问题标题】:WildFly9 JASPI Module Isolated from ApplicationWildFly9 JASPI 模块与应用程序隔离
【发布时间】:2016-06-10 09:26:27
【问题描述】:

我正在尝试创建一个完全与我的 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.earjboss-web.xml 一起发布my-app.war 指向“样本”安全域时,它成功找到了我想要的类,启动了 JASPI 生命周期,但是当它开始创建时Spring Context 和 Spring Beans 它落在 my-app.ear.my-app.war Module Classloader 上,并且正如预期的那样找不到类。

ClassNotFoundException: com.my.module.ClassX from [Module "deployment.my-app.ear.my-app.war:main" from Service Module Loader]

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

我的问题是:

  • 是否可以将 JASPI 模块类与我的应用程序隔离开来?
  • 是否推荐这种方法(挂钩为 org.picketbox 依赖项)?
  • 是 Spring Framework 2.5.5 的限制吗?也许它使用了当前线程类加载器以外的类加载器。

提前致谢。

【问题讨论】:

    标签: java spring jboss wildfly-9 jaspic


    【解决方案1】:

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

    这里:https://developer.jboss.org/wiki/ModuleCompatibleClassloadingGuide

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

    我发现旧版 Spring 2.5.5 使用 TCCL 加载类并实例化其 bean。

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

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

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

    【讨论】:

    • 如果这解决了您的问题,您应该检查问题旁边的✔。
    【解决方案2】:

    将 JASPIC 模块 (SAM) 与应用程序隔离的另一种方法是将其部署为单独的战争。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2012-01-01
      • 1970-01-01
      • 2014-06-29
      • 2018-10-06
      • 2018-09-29
      相关资源
      最近更新 更多