2015-08-09 56 views
9

據到Apache Tomcat 1.7文檔:的Apache Tomcat 1.7如何將其他參數傳遞到JAAS

基於JAAS編寫自己的LoginModule,用戶和角色類(見JAAS認證教程和JAAS登錄模塊開發者指南)由JAAS登錄上下文(javax.security.auth.login.LoginContext)管理在開發LoginModule時,請注意,JAASRealm的內置Call​​backHandler目前僅識別NameCallback和PasswordCallback。

它只支持NameCallback和PasswordCallback。我想將其他參數傳遞給JAAS登錄模塊,但由於此限制而無法傳遞。

如何將附加參數傳遞給JAAS登錄模塊?

+0

您可以在jaas.config文件中與登錄模塊一起定義它們,並在初始化期間檢索它們。 – EJP

+0

@EJP我正在使用我在context.xml中定義的默認tomcat org.apache.catalina.realm.JAASRealm。這個JAASRealm默認調用它自己的回調處理程序。即使我定義了自定義回調處理程序,但不會被JAASRealm調用。我如何強制這個在我的context.xml中定義的JAASRealm來使用這個自定義回調處理程序? – yapkm01

+0

Tomcat 1.7,當然?或者更確切地說Tomcat 7,正如您使用的標籤所示? –

回答

1

編寫您自己的CallbackHandler。有關詳細信息,請參閱http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html

例如,MyCallbackHandler可以支持額外的TextOutputCallback並將

public void handle(Callback[] callbacks) 
    throws IOException, UnsupportedCallbackException { 

    for (int i = 0; i < callbacks.length; i++) { 
    if (callbacks[i] instanceof TextOutputCallback) { 

     // display a message according to a specified type 
     . . . 

    } else if (callbacks[i] instanceof NameCallback) { 

     // prompt the user for a username 
     . . . 

    } else if (callbacks[i] instanceof PasswordCallback) { 

     // prompt the user for a password 
     . . . 

    } else { 
     throw new UnsupportedCallbackException 
     (callbacks[i], "Unrecognized Callback"); 
    } 
    } 
} 
+0

我的確如此,但在context.xml中定義的默認org.apache.catalina.realm.JAASRealm並沒有調用它。它調用其他回調處理程序。我如何強制這個JAASRealm來調用我的自定義回調處理程序? – yapkm01

+0

看看org.apache.catalina.realm.JAASRealm源代碼,我發現它總是使用**新的JAASCallbackHandler()**來傳遞迴調處理程序。我開始認爲用Tomcat的JAAS設置定製的一個是不可能的。在獨立應用程序中,您可以使用您的處理程序創建一個LoginContext: loginContext = new LoginContext(「Sample」,new MyCallbackHandler()); –

+0

那麼這裏有什麼解決方案? – yapkm01

-4

最簡單的方法:CONCAT所有參數爲一個字符串,然後把它分解後

+0

回覆的評論是的。我想到,即使它不是一個好的。我沒有看到任何其他解決方案。所以驚訝的是,這樣一個簡單的問題不能由Tomcat解決 – yapkm01

1

傳統方式方法是將您的contractorcustomer組映射到角色

  • 下載的副本Servlet 3.0 Specification(Tomcat的7.0就是這樣的一個實現)和閱讀安全一章,以看到由servlet容器認證用戶基於用戶名和密碼所提供的選項衆多然後授權用戶根據他們的角色
  • 按照Tomcat文檔中的說明配置JNDIRealm。這提供了一種配置Tomcat以使用LDAP服務器進行認證(用戶名/密碼)和授權(角色檢查)的方法。

使用這樣的規範爲基礎的方法有責任確保您的解決方案的好處是便攜,你應該決定遷移到一個完全成熟的Java EE解決方案(如JBossAS/WildFly,Glassfish的中,WebSphere等)在未來。

此外,如果您能夠遷移到Tomcat 8,您將有權訪問已添加到Servlet 3.1規範中的其他身份驗證功能。

+0

如果用戶有多個角色會發生什麼?在登錄屏幕上只使用用戶名/密碼登錄時該用戶將扮演什麼角色?請記住,不同的角色可能會對不同的頁面提供不同的授權訪問權限 – yapkm01

+0

此解決方案允許多個角色。這取決於你如何管理。如果用戶既是承包商又是客戶,會發生什麼? –

+0

Yeap。說用戶abc是承包商和定製者。每個角色對某些屏幕有自己的訪問權限。在登錄屏幕abc登錄只需使用他的ID和密碼。服務器將知道哪些角色?服務器端無法知道。解決方案您需要使用其他字段的登錄屏幕通知服務器用戶abc現在以承包商身份登錄(作爲示例)。然後,服務器知道要將承包商角色分配給abc,並讓他訪問與承包商(而非客戶)相關的屏幕。現在看照片? – yapkm01

相關問題