Веб-приложение Geronimo с аутентификацией ldap

Я использую Apache Geronimo в качестве сервера приложений. И аутентификация происходит через LDAP с использованием службы каталогов Apache. У меня нет никакого предыдущего опыта разработки программного обеспечения 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. Поведение должно быть таким же, как у неаутентифицированного пользователя.

Во всех этих случаях пользователь не может повторить процесс входа в систему до тех пор, пока браузер не будет перезапущен или не будет использован другой браузер. Это большая проблема, которая у меня есть.

Я хотел бы, чтобы произошли следующие сценарии.

  1. Правильно аутентифицированный пользователь может выйти из системы и попытаться снова войти в систему.

  2. Пользователь, не прошедший проверку подлинности, перенаправляется на экран входа в систему и предлагает повторить попытку.

Что мне нужно сделать, чтобы это произошло? Спасибо за вашу помощь.


person Robert Parker    schedule 27.07.2010    source источник


Ответы (1)


Разве это не всегда происходит. Вы сталкиваетесь с проблемой, боретесь с ней несколько дней, наконец, публикуете ее в StackOverflow (или где-то еще), а затем относительно легко решаете проблему.

Я внес некоторые изменения в свое приложение, которые устранили проблему. Я публикую то, что сделал, на случай, если кто-нибудь наткнется на это из Google с похожей проблемой.

Сначала я создал сервлет (названный 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:

<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. Это завершает сеанс и перенаправляет их на страницу входа.

Так что теперь все сценарии работают нормально.

person Robert Parker    schedule 27.07.2010