Стандартная форма аутентификации Java-сервлетов
Каков стандартный способ проверки подлинности с помощью сервлетов Java?
С тех пор я реализовал это сам, используя простую форму POST HTML:
- проверка отправленных параметров по базе данных
- если имеется, сохраните объект User в HttpSession
- проверьте в каждом сервлете, присутствует ли этот объект
- если нет: перенаправить на страницу входа с сообщением об ошибке
Но теперь я споткнулся о том, как настроить безопасность с помощью Embedded Jetty, и теперь я думаю о том, что могу повторно использовать уже реализованные решения этой проблемы, но каков здесь стандартный подход? Я сам использую Jetty, но как насчет Tomcat или других веб-серверов?
Я также читал о j_security_check, что с этим? Это устаревший метод?
3 ответа
Вы должны использовать защиту JAAS, обеспечиваемую сервлет-контейнерами, такими как Tomcat, Websphere, Glassfish.
По умолчанию эти контейнеры поддерживают следующие типы аутентификации:
- Бейсик
- ДАЙДЖЕСТ
- FORM
- CLIENT-CERT
Базовая аутентификация HTTP
Указание базовой аутентификации HTTP требует, чтобы сервер запрашивал имя пользователя и пароль у веб-клиента и проверял действительность имени пользователя и пароля, сравнивая их с базой данных авторизованных пользователей в указанной области или области по умолчанию.
Обычная проверка подлинности используется по умолчанию, если не указан механизм проверки подлинности.
При использовании базовой аутентификации выполняются следующие действия:
- Клиент запрашивает доступ к защищенному ресурсу.
- Веб-сервер возвращает диалоговое окно, которое запрашивает имя пользователя и пароль.
- Клиент отправляет имя пользователя и пароль на сервер. 4.\ Сервер аутентифицирует пользователя в указанной области и, в случае успеха, возвращает запрошенный ресурс.
На рисунке ниже показано, что происходит, когда вы указываете базовую аутентификацию HTTP.
Базовая аутентификация HTTP Диаграмма четырех шагов в базовой аутентификации HTTP между клиентом и сервером
Аутентификация на основе форм
Аутентификация на основе форм позволяет разработчику контролировать внешний вид экранов аутентификации при входе в систему, настраивая экран входа и страницы ошибок, которые HTTP-браузер представляет конечному пользователю. При объявлении проверки подлинности на основе форм выполняются следующие действия.
- Клиент запрашивает доступ к защищенному ресурсу.
- Если клиент не прошел проверку подлинности, сервер перенаправляет клиента на страницу входа.
- Клиент отправляет форму входа на сервер.
- Сервер пытается аутентифицировать пользователя.
- Если аутентификация прошла успешно, субъект аутентифицированного пользователя проверяется, чтобы убедиться, что он в роли, которой разрешен доступ к ресурсу. Если пользователь авторизован, сервер перенаправляет клиента на ресурс, используя сохраненный путь URL-адреса.
- Если аутентификация не пройдена, клиент перенаправляется или перенаправляется на страницу ошибки.
На рисунке ниже показано, что происходит, когда вы указываете аутентификацию на основе форм.
При создании входа в систему на основе форм обязательно поддерживайте сеансы, используя файлы 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);