Стандартная форма аутентификации Java-сервлетов

Каков стандартный способ проверки подлинности с помощью сервлетов Java?

С тех пор я реализовал это сам, используя простую форму POST HTML:

  1. проверка отправленных параметров по базе данных
  2. если имеется, сохраните объект User в HttpSession
  3. проверьте в каждом сервлете, присутствует ли этот объект
  4. если нет: перенаправить на страницу входа с сообщением об ошибке

Но теперь я споткнулся о том, как настроить безопасность с помощью Embedded Jetty, и теперь я думаю о том, что могу повторно использовать уже реализованные решения этой проблемы, но каков здесь стандартный подход? Я сам использую Jetty, но как насчет Tomcat или других веб-серверов?

Я также читал о j_security_check, что с этим? Это устаревший метод?

3 ответа

Решение

Вы должны использовать защиту JAAS, обеспечиваемую сервлет-контейнерами, такими как Tomcat, Websphere, Glassfish.

По умолчанию эти контейнеры поддерживают следующие типы аутентификации:

  • Бейсик
  • ДАЙДЖЕСТ
  • FORM
  • CLIENT-CERT

Базовая аутентификация HTTP

Указание базовой аутентификации HTTP требует, чтобы сервер запрашивал имя пользователя и пароль у веб-клиента и проверял действительность имени пользователя и пароля, сравнивая их с базой данных авторизованных пользователей в указанной области или области по умолчанию.

Обычная проверка подлинности используется по умолчанию, если не указан механизм проверки подлинности.

При использовании базовой аутентификации выполняются следующие действия:

  1. Клиент запрашивает доступ к защищенному ресурсу.
  2. Веб-сервер возвращает диалоговое окно, которое запрашивает имя пользователя и пароль.
  3. Клиент отправляет имя пользователя и пароль на сервер. 4.\ Сервер аутентифицирует пользователя в указанной области и, в случае успеха, возвращает запрошенный ресурс.

На рисунке ниже показано, что происходит, когда вы указываете базовую аутентификацию HTTP.

Базовая аутентификация HTTP Диаграмма четырех шагов в базовой аутентификации HTTP между клиентом и сервером

Аутентификация на основе форм

Аутентификация на основе форм позволяет разработчику контролировать внешний вид экранов аутентификации при входе в систему, настраивая экран входа и страницы ошибок, которые HTTP-браузер представляет конечному пользователю. При объявлении проверки подлинности на основе форм выполняются следующие действия.

  1. Клиент запрашивает доступ к защищенному ресурсу.
  2. Если клиент не прошел проверку подлинности, сервер перенаправляет клиента на страницу входа.
  3. Клиент отправляет форму входа на сервер.
  4. Сервер пытается аутентифицировать пользователя.
  5. Если аутентификация прошла успешно, субъект аутентифицированного пользователя проверяется, чтобы убедиться, что он в роли, которой разрешен доступ к ресурсу. Если пользователь авторизован, сервер перенаправляет клиента на ресурс, используя сохраненный путь URL-адреса.
  6. Если аутентификация не пройдена, клиент перенаправляется или перенаправляется на страницу ошибки.

На рисунке ниже показано, что происходит, когда вы указываете аутентификацию на основе форм.

При создании входа в систему на основе форм обязательно поддерживайте сеансы, используя файлы cookie или информацию о сеансах SSL.

Чтобы аутентификация проходила надлежащим образом, действие формы входа в систему всегда должно быть j_security_check. Это ограничение сделано для того, чтобы форма входа в систему работала независимо от того, для какого ресурса она предназначена, и чтобы сервер не требовал указывать поле действия исходящей формы. Следующий фрагмент кода показывает, как форма должна быть закодирована в HTML-страницу:

<form method="POST" action="j_security_check">
  <input type="text" name="j_username">
  <input type="password" name="j_password">
</form>

Дайджест-аутентификация

Как и обычная аутентификация, дайджест-аутентификация аутентифицирует пользователя на основе имени пользователя и пароля. Однако, в отличие от базовой аутентификации, дайджест-аутентификация не отправляет пароли пользователей по сети. Вместо этого клиент отправляет односторонний криптографический хэш пароля и дополнительных данных. Хотя пароли не передаются по сети, дайджест-проверка подлинности требует, чтобы эквиваленты паролей в открытом виде были доступны для контейнера проверки подлинности, чтобы он мог проверять полученные средства проверки подлинности путем вычисления ожидаемого дайджеста.

Рекомендации:

Попробуйте использовать фильтры сервлетов, не нужно настраивать JAAS и другой персонал

Попробуйте переадресовать на страницу с ошибкой, только если данные о пользователе отсутствуют в базе данных. Если вы нашли своего пользователя, используйте следующий код, чтобы перенаправить его на свою "домашнюю" страницу

RequestDispatcher dis = request.getRequestDispatcher("relativeURL2Jsp");
dis.forward(request, response);
Другие вопросы по тегам