2012-06-19 80 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通过混帐把它拿来克隆。

相关问题