0

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

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

4

2 回答 2

4

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

然后,您需要通过<security-constraint>web.xml. <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>

登录表单应该 POSTj_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(). 另请参阅使用 j_security_check 在 Java EE / JSF 中执行用户身份验证

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

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

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

于 2012-06-19T15:07:56.090 回答
0

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

我将在这里大致描述我们所做的事情,但请 - 看看代码:

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

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

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

此时,您已通过 Active-Directory 的身份验证,该 Active-Directory 同时用作 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,您可以通过 git clone 从 oVirt 获取它。

于 2012-06-19T15:21:22.747 回答