2015-12-14 102 views
6

我有一個使用Spring MVC的java webapp。 webapp運行在使用帶有表單身份驗證的JAAS登錄模塊的jboss AS7.1服務器上。當用戶在表單上填寫他的用戶名和密碼時,登錄工作將順利進行。JAAS自動登錄而不顯示登錄頁面/表格

我現在想創建一個「控制用戶」的java控制器,就好像用戶填寫了登錄表單一樣。

public void logInProgrammatically(String username, string password) 
{ 
    //??? 
} 

當上述完成的方法,對任何受保護的頁面的任何訪問應被允許的,因爲用戶所考慮的記錄。

可以這樣通過訪問JBoss的實現登錄模塊,並設置一些屬性進行編程?

+0

請問您正在嘗試解決什麼問題? –

回答

0

WebAuthentication來自Jboss提供了幾乎開箱即用的功能。這個想法是,你可以創建自己的servlet或自定義類,如here,可以直接調用指定的userpassword

即,在logInProgrammatically你可以有類似於已經提出hereLoginHandler已經實現的東西:

public void logInProgrammatically(String username, string password) 
{ 
    // ... 
    WebAuthentication webA = new WebAuthentication(); 
    webA.login(username, password); 
    // ... 
} 
+0

WebAuthentication類不在JBOSS7中。它在舊的jboss版本中可用。我不確定它爲什麼被刪除。有其他選擇嗎? – user1884155

+0

@ user1884155就像你在其他問題的評論中提到的那樣。您可以使用'Servlet3AuthenticationFilter',即使用'Servlet 3'登錄規範。 – dan

0

可以使用JAAS標準類以編程方式實現身份驗證。假設我們正在使用我們自定義的LoginModule實現(或任何標準實現),com.sample.CustomLoginModule。此登錄模塊在jboss配置XML中配置。

第1步:在JBoss中定義一個安全域。對於其他服務器,可以在JAAS配置中配置相同的信息。

<security-domain name="customlogin" cache-type="default"> 
    <authentication> 
     <login-module code="com.sample.CustomLoginModule" flag="required"> 
     </login-module> 
    </authentication> 
</security-domain> 

步驟2:使用自定義登錄模塊以編程方式登錄用戶。

public void logInProgrammatically(String username, string password){ 
    CallbackHandler handler = //use proper implementation to capture username and password arguments. 
    LoginContext ctx = new LoginContext("customlogin", handler); 
    ctx.login(); 

}

有了這個解決方案,你是不是綁定到特定的應用程序服務器API。此代碼可通過任何具有JAAS配置更改的應用程序服務器移植。

對於使用JAAS編程認證,看到從Oracle教程: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html

+0

這不起作用,因爲儘管我在上下文中登錄,但JBOSS容器並不知道這個事實。因此,它將阻止訪問受保護的頁面並顯示登錄屏幕。爲什麼是這樣? jboss看到/使用什麼神奇的(請求)屬性,登錄上下文沒有設置/使用? – user1884155