java - 如何根据 Windows AD 对用户进行身份验证?

标签 java windows hibernate jsf authentication

<分区>

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

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

最佳答案

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

然后您需要通过声明适当的 <security-constraint> 来配置您的 Web 应用程序以要求特定页面登录。输入 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>

登录表单应该 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

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

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

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

关于java - 如何根据 Windows AD 对用户进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103585/

相关文章:

java - 通过 GAE 进行客户端通信

JAVA传递原始类型作为函数调用的引用

java - 我们的 war/WEB-INF 文件夹中资源的文件路径?

windows - 什么是 Windows Azure?

vb.net - 在 VB 中创建的 .txt 文件与我随机创建的文件是否不同?

java - Hibernate ManyToMany 只持久化

java - 如何将逗号分隔的字符串转换为列表?

java - 使用外键从表中检索条目(Hibernate)

java - Hibernate 查询缓存,行为不符合预期

c - 如何在 C 语言中通过串行端口发送 0xff 字节?