我有一个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