2011-11-03 151 views
0

在我們的應用程序中,我們需要讓用戶在使用基於表單的身份驗證進行登錄時選擇所需的數據源,並且我不確定在使用基於標準表單的身份驗證時它是否完全可能。我聽說有可能使用TextInputCallback,但不知道如何(以及在​​哪裏)實現它。將附加參數傳遞給j_security_check

+0

TextInputCallback是JAAS的一部分。 – EJP

回答

0

web.xml中最多可以有一個<login-config>標籤。這意味着您不能在一個Web應用程序中使用多個領域。所以,你需要一個或多或少的容器特定的解決方案。

在Tomcat中有一個CombinedRealm可以使用其他領域。

包含一個或多個領域的領域實現。每個領域的驗證 都按照它們配置的順序進行嘗試。如果有任何 領域認證用戶,那麼認證成功。當 組合領域用戶名在所有組合的 領域中應該是唯一的。

也許它符合您的要求。如果不是,並且用戶存在於多個領域(使用相同的用戶名),則可以使用前綴。例如,設置"domain\myuser"作爲用戶名。

如果您使用嵌套的JDBCRealm,您可以創建一個數據庫視圖,其中包含前綴用戶名(只需使用用戶名連接前綴)並將此視圖用作用戶表。

另一種方法是刪除自定義領域中的前綴並調用容器的JDBCRealm(或其他領域),但它需要一些編碼。無論如何,它不應該太難,已經存在的領域可能可以與代表設計模式一起使用。

+0

如果我的想法正確無誤,我需要修改數據庫來執行此操作。但是如何使用Spring的AbstractRoutingDataSource在它們之間切換?這是一個遷移/集成項目,所以我們不能改變數據庫設置,也不能添加任何新的東西。 – Sergey

+0

如果使用'CombinedRealm'並且數據庫不包含相同的用戶名,則不必創建新視圖。如果您使用'CombinedRealm'並且數據庫包含相同的用戶名,則可以編寫自定義領域(無需修改數據庫)。我不知道Spring的'AbstractRoutingDataSource'。 – palacsint