使用ldap身份验证的Geronimo webapp

时间:2010-07-27 12:33:19

标签: authentication java-ee logout geronimo

我正在使用Apache Geronimo作为我的应用服务器。并且使用Apache Directory Service在LDAP上进行身份验证。我以前没有任何JavaEE软件开发经验,所以请放轻松。如果我需要更详细地解释一下,请告诉我。

基本上我的登录步骤与geronimo文档中的此示例非常相似: https://cwiki.apache.org/GMOxDOC22/ldap-sample-app-ldap-sample-application.html

当用户尝试登录时,会发生三种不同的行为:

  1. 当用户使用正确的用户名(正确的ldap组)登录时,他们将被带到站点的安全区域。而且我不确定如何在会话结束之前将用户退出网站。

  2. 当用户使用不在LDAP目录中的用户名/密码登录时,用户将被重定向到/auth/logonError.html?param=test(此位置在'web中指定。 XML')

  3. 当用户使用不在相应组中的正确用户名/密码登录时,会将其重定向到“HTTP 403禁止页面”。在ldap示例的底部有一个此页面的示例。该行为应与未经身份验证的用户相同。

  4. 在所有这些情况下,在重新启动浏览器或使用其他浏览器之前,用户无法重试登录过程。这是我遇到的一个大问题。

    我希望发生以下情况。

    1. 经过适当身份验证的用户可以退出,并尝试重新登录。

    2. 未经身份验证的用户会被重定向到登录屏幕,并被告知要再试一次。

    3. 我需要做些什么来实现这一目标?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这不总是发生。你遇到了一个问题,几天都在努力,最后把它发布到StackOverflow(或者任何地方),然后你就可以相对容易地解决问题了。

我对修复问题的应用程序进行了一些更改。我发布了我所做的事情,万一有人在谷歌遇到类似问题时遇到这种情况。

首先,我创建了一个servlet(名为EndSessionServlet),它就是这样做的:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    endSession(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    endSession(request, response);
}

private void endSession(HttpServletRequest request, HttpServletResponse response) throws IOException{
    request.getSession().invalidate();
    response.sendRedirect(".");
}

然后我将其添加到我的web.xml文件中:

<error-page>
 <error-code>403</error-code>
 <location>/EndSessionServlet</location>
</error-page>

我还更改了web.xml中的form-error-page:

<login-config>
<auth-method>FORM</auth-method>
<realm-name>This is not used for FORM login</realm-name>
<form-login-config>
  <form-login-page>/login.jsp</form-login-page>
  <form-error-page>/EndSessionServlet</form-error-page>
</form-login-config>
</login-config>

我在网页的部分中添加了一个链接,该链接已通过EndSessionServlet验证。因此,经过身份验证的用户现在可以正常注销。

对于这三种情况:

  1. 用户可以正常登录,用户点击EndSessionServlet链接注销
  2. 用户输入ldap的有效用户名/密码,但不在正确的组中。此用户正常发送到403页面,现在会话无效,并重定向到登录页面。
  3. 用户输入无效的用户名/密码并发送给,也设置为EndSessionServlet。这将结束会话,并将它们重定向到登录页面。
  4. 所以所有场景现在都可以正常工作。