我是一个JSF-Hibernate Web应用程序。我需要针对Windows AD对用户进行身份验证,并且Web应用程序应该只允许来自X组成员的登录,否则它应该重定向到错误页面。我该如何配置?
另外,我想在所有页面上显示登录用户的名称,而不是服务器计算机的Windows用户名。我为此尝试了System.property("user.name")
,但这只返回服务器名称的Windows用户名。
答案 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_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" />
等等,那么你也可以提交一个支持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获取代码。