我有一個JSF-Hibernate Web應用程序。我需要根據Windows AD對用戶進行身份驗證,並且Web應用程序只應允許從X組成員進行登錄,否則應該重定向到錯誤頁面。我該如何配置?如何根據Windows AD對用戶進行身份驗證?
此外,我想在所有頁面上顯示登錄用戶的名稱,而不是服務器計算機的Windows用戶的名稱。我試過System.property("user.name")
,但這隻返回服務器名稱的Windows用戶名。
我有一個JSF-Hibernate Web應用程序。我需要根據Windows AD對用戶進行身份驗證,並且Web應用程序只應允許從X組成員進行登錄,否則應該重定向到錯誤頁面。我該如何配置?如何根據Windows AD對用戶進行身份驗證?
此外,我想在所有頁面上顯示登錄用戶的名稱,而不是服務器計算機的Windows用戶的名稱。我試過System.property("user.name")
,但這隻返回服務器名稱的Windows用戶名。
您需要在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_username
和j_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沒有意義在這方面。
你answaer似乎很有效,但就像我看到它需要時間來實現,對我來說我沒有訪問AD服務器,所以,如果你有一個像System.property(「user.name」)的方法,它給出了客戶端窗口用戶的當前用戶的名字! – Potinos
我正在使用tomcat作爲服務器!我與JSF一起工作,所以我不知道如何使用JSF以同樣的方式調用#{request.remoteUser}?非常感謝! – Potinos
這是不可能的,如果客戶端沒有登錄到您的Web應用程序。如果你使用的是Tomcat,那麼給定的鏈接應該完全適合你。配置服務器的方式是服務器管理員的責任。你似乎只是一個Web開發人員。你確定你應該是應該配置servletcontainer一方的人嗎?如果可能,請與您的項目負責人和/或服務器管理員聯繫。 '#{request.remoteUser} ** **是JSF的方式。我甚至已經明確地提到*「你可以在JSF EL中訪問它,以及:」*你是否以任何方式理解答案? – BalusC
我想建議你看看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通過混帳把它拿來克隆。
您需要要更清楚一些。英語可能不是你的第一語言,但這是非常不明確的。 – OmniOwl
如果你使用的是Tomcat:http://stackoverflow.com/a/267906/368544 – mschonaker