2012-06-19 118 views
1

我有一個JSF-Hibernate Web應用程序。我需要根據Windows AD對用戶進行身份驗證,並且Web應用程序只應允許從X組成員進行登錄,否則應該重定向到錯誤頁面。我該如何配置?如何根據Windows AD對用戶進行身份驗證?

此外,我想在所有頁面上顯示登錄用戶的名稱,而不是服務器計算機的Windows用戶的名稱。我試過System.property("user.name"),但這隻返回服務器名稱的Windows用戶名。

+0

您需要要更清楚一些。英語可能不是你的第一語言,但這是非常不明確的。 – OmniOwl

+0

如果你使用的是Tomcat:http://stackoverflow.com/a/267906/368544 – mschonaker

回答

4

您需要在servletcontainer上創建一個所謂的「LDAP領域」。如何做到這一點取決於使用的servletcontainer。由於您沒有提供有關所使用的servletcontainer的詳細信息,因此很難給出合適的答案,但通常只需閱讀有關Realm配置的servletcontainer文檔就足夠了。例如,Tomcat就是Realm Configuration HOW-TO。對於Tomcat,您需要一個JNDIRealm。更多細節可在JSP wiki中找到。

然後,您需要通過在web.xml中聲明相應的<security-constraint>條目來配置您的Web應用程序以要求登錄特定頁面。您可以在<login-config>條目中配置登錄和錯誤頁面,與web.xml完全相同。

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>secured</web-resource-name> 
     <url-pattern>/secured/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>X</role-name> <!-- Should be your AD group name. --> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>FORM</auth-method> 
    <form-login-config> 
     <form-login-page>/login.xhtml</form-login-page> 
     <form-error-page>/error.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 

登錄表單應該張貼到j_security_check和使用j_usernamej_password作爲輸入字段名。

<form action="j_security_check" method="post"> 
    <input type="text" name="j_username" /> 
    <input type="password" name="j_password" /> 
    <input type="submit" value="login" /> 
</form> 

如果你想在驗證更爲精細的控制,因此要使用JSF <h:inputText required="true" />等等,那麼你也可以提交,後者又調用HttpServletRequest#login() backing bean的操作方法。又見Performing user authentication in Java EE/JSF using j_security_check

至於獲取登錄的用戶的名稱,只是用在JSF方面ExternalContext#getRemoteUser()HttpServletRequest#getRemoteUser()在servlet上下文。您可以在JSF EL如下訪問它,以及:

<p>Welcome, #{request.remoteUser}</p> 

系統屬性確實返回服務器自己的用戶,這使得absoutely沒有意義在這方面。

+0

你answaer似乎很有效,但就像我看到它需要時間來實現,對我來說我沒有訪問AD服務器,所以,如果你有一個像System.property(「user.name」)的方法,它給出了客戶端窗口用戶的當前用戶的名字! – Potinos

+0

我正在使用tomcat作爲服務器!我與JSF一起工作,所以我不知道如何使用JSF以同樣的方式調用#{request.remoteUser}?非常感謝! – Potinos

+0

這是不可能的,如果客戶端沒有登錄到您的Web應用程序。如果你使用的是Tomcat,那麼給定的鏈接應該完全適合你。配置服務器的方式是服務器管理員的責任。你似乎只是一個Web開發人員。你確定你應該是應該配置servletcontainer一方的人嗎?如果可能,請與您的項目負責人和/或服務器管理員聯繫。 '#{request.remoteUser} ** **是JSF的方式。我甚至已經明確地提到*「你可以在JSF EL中訪問它,以及:」*你是否以任何方式理解答案? – BalusC

0

我想建議你看看oVirt的開源項目。我們在那裏有一個基於GWT的webadmin和一個使用Kerberos作爲身份驗證協議(它也支持SIMPLE身份驗證)的LDAP服務器身份驗證的REST-API Web應用程序。

,我將在這裏描述一般我們做什麼,但請 - 看看代碼:

  • 我們使用JAAS + Krb5LoginModule以進行登錄操作的Kerberos(您必須設置的Kerberos通過System.setProperties使用krb5.conf文件)

  • 後成功登錄相關的信息,如KDC,或者,我們運行一個PrivilegedAction(見JAAS API)

  • 我們PrivilegedAction使用GSSAPI(這是用於Kerberos,您也可以使用SIMPLE來代替),並且由於成功登錄而具有正確的憑據。

在這一點上,你進行身份驗證對Active-目錄,其既作爲LDAP服務器和KDC

該解決方案是容器獨立的,可以從一個簡單,獨立的Java程序甚至工作(當然,您需要定義一個適當的JAAS的conf文件。如果你正在使用JBoss AS 7.1.x,因爲我們做的,需要standalone.xml這個問題

代碼駐留在ovirt-engine/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker的照顧,你可以從oVirt通過混帳把它拿來克隆。

相關問題