如何针对Windows AD对用户进行身份验证?

时间:2012-06-19 14:50:34

标签: java windows hibernate jsf authentication

我是一个JSF-Hibernate Web应用程序。我需要针对Windows AD对用户进行身份验证,并且Web应用程序应该只允许来自X组成员的登录,否则它应该重定向到错误页面。我该如何配置?

另外,我想在所有页面上显示登录用户的名称,而不是服务器计算机的Windows用户名。我为此尝试了System.property("user.name"),但这只返回服务器名称的Windows用户名。

2 个答案:

答案 0 :(得分:4)

您需要创建一个所谓的" LDAP领域"在servletcontainer上。如何执行此操作取决于使用的servletcontainer。由于您没有提供有关所使用的servlet容器的任何详细信息,因此很难给出合适的答案,但通常只需阅读servletcontainer关于Realm配置的文档就足够了。在例如Tomcat的情况下,它是Realm Configuration HOW-TO。对于Tomcat,您需要JNDIRealm。更多细节可以在JSP wiki

中找到

然后,您需要通过在<security-constraint>中声明相应的web.xml条目来配置您的Web应用程序以要求登录特定页面。您可以在同一<login-config>。{/ p>中的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>

登录表单应POST到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" />等等,那么你也可以提交一个支持bean动作方法,然后再调用HttpServletRequest#login()。另请参阅Performing user authentication in Java EE / JSF using j_security_check

关于获取登录用户的名称,只需在JSF上下文中使用ExternalContext#getRemoteUser()或在servlet上下文中使用HttpServletRequest#getRemoteUser()。您可以在JSF EL中访问它,如下所示:

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

系统属性确实返回服务器自己的用户,这在这种情况下绝对没有意义。

答案 1 :(得分:0)

我建议你看一下oVirt的开源项目。我们有一个基于GWT的webadmin和一个REST-API Web应用程序,它使用Kerberos作为身份验证协议(它还支持SIMPLE身份验证)对LDAP服务器执行身份验证。

我将在这里一般性地描述我们的工作,但请 - 请看一下代码:

  • 我们使用JAAS + Krb5LoginModule来执行Kerberos的登录操作(您必须通过System.setProperties设置Kerberos相关信息,例如KDC,或使用krb5.conf文件)

  • 登录成功后,我们运行PrivilegedAction(参见JAAS API)

  • 我们的PrivilegedAction使用GSSAPI(这适用于Kerberos,您也可以使用SIMPLE)并且具有成功登录后的正确凭据。

此时,您通过Active-Directory进行身份验证,该服务器同时用作Ldap服务器和KDC

此解决方案与容器无关,甚至可以从一个简单的独立Java程序开始工作(当然,您需要定义一个合适的JAAS conf文件。如果您像我们一样使用JBoss AS 7.1.x,{{ 1}}处理这个问题

代码位于standalone.xml,您可以通过git clone从oVirt获取代码。