2016-02-27 54 views
4

我試圖創建一個自定義的JASPI ServerAuthModule,它完全與我的EAR應用程序隔離。它取決於Spring框架2.5.5的傳統版本。我正在運行WildFly 9.0.2.Final。從應用程序中分離出來的WildFly9 JASPI模塊

我定義一個適當的安全域:

<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> 

再定義一個定製的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 (..) 

然後我迷上了我的模塊作爲picket box依賴。

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.warjboss-web.xml指向「樣本」安全域,它成功地找到我想要的班,開始JASPI生命週期,但隨後開始創建Spring上下文時和Spring Beans,它落在my-app.ear.my-app.war模塊類加載器上,並且如預期的那樣找不到類。

ClassNotFoundException的:從com.my.module.ClassX [模塊 「deployment.my-app.ear.my-app.war:主」 從服務模塊加載]

我不想要在jboss-deployment-structure.xml中添加com.my.module作爲依賴項。這樣做可以使應用程序按需要工作。雖然我需要它孤立。

我的問題是:

  • 是否有可能在JASPI模塊類從我的應用程序隔離?
  • 這種方法(掛鉤爲org.picketbox依賴)推薦?
  • 是Spring Framework 2.5.5的限制嗎?也許它使用的不是當前線程類加載器的類加載器。

在此先感謝。

回答

1

我找到了一個有趣的指南,向我們解釋了很多關於JBoss模塊和類加載問題。

這裏:https://developer.jboss.org/wiki/ModuleCompatibleClassloadingGuide

它說,TCCL可以在某些情況下,癌症。

我發現傳統的Spring 2.5.5使用TCCL來加載類並實例化它的bean。

要糾正此行爲,我擴展了ClassPathXmlApplicationContext並覆蓋了原來從TCCL(ClassUtils.getDefaultClassLoader)獲得的getClassLoader()

一切開始工作,從主應用程序隔離。問題解決了。

如果有人試圖做一些孤立的模塊實現,並得到奇怪的行爲,我建議開始懷疑你的底層框架。

+0

如果這解決了你的問題,你應該檢查你的問題旁邊的✔。 –

1

將JASPIC模塊(SAM)與應用程序隔離的另一種選擇是將其作爲單獨的戰爭進行部署。

這可以通過使用編程選項來註冊一個SAM,但通過一個null爲應用程序上下文ID。 SAM然後可用於部署在同一AS上的所有其他存檔。

相關問題