Распространенным способом аутентификации с использованием имени пользователя и пароля является использование Базовая аутентификация. В основном клиенту необходимо отправить заголовок запроса Authorization со значением заголовка как Basic Base64Encoded(username:password). Итак, мое имя пользователя peeskillet и мой пароль pass, я, как клиент, должен установить заголовок как
Authorization: Basic cGVlc2tpbGxldDpwYXNz
В среде сервлетов контейнер должен поддерживать обычную аутентификацию. Вы должны настроить эту поддержку в файле web.xml. Вы можете увидеть пример в 48.2 Защита веб-приложений учебника по Java EE. Вы также заметите в примере
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
Это для поддержки SSL. Это рекомендуется для базовой аутентификации.
Если вы не хотите иметь дело с проблемами работы с доменами безопасности и модулями входа в систему, областью и т. д., которые потребуются для настройки поддержки сервлетов, или если вы просто не находитесь в среде сервлетов, реализация Basic Auth в ContainerRequestFilter действительно не так уж сложно.
Вы можете увидеть полный пример того, как это можно сделать, по адресу https://github.com/jersey/jersey/tree/master/examples/https-clientserver-grizzly. Вы должны сосредоточиться на SecurityFilter
Основной поток в фильтре выглядит примерно так
Получите заголовок Authorization. Если он не существует, введите AuthenticationException. В этом случае AuthenticationExceptionMapper отправит заголовок "WWW-Authenticate", "Basic realm=\"" + e.getRealm() + "\", который является частью протокола Basic Auth.
Получив заголовок, мы анализируем его, чтобы получить имя пользователя: пароль в кодировке Base64. Затем мы расшифровываем его, затем разделяем, затем разделяем имя пользователя и пароль. Если какой-либо из этих процессов завершается сбоем, снова выдайте WebApplicationException, который соответствует 400 Bad Request.
Проверьте имя пользователя и пароль. Исходный код примера просто проверяет, является ли имя пользователя user и пароль password, но вы захотите использовать какой-либо сервис в фильтре, чтобы проверить эту информацию. Если что-то из этого не работает, бросьте AuthenticationException
Если все идет хорошо, из метода authenticate создается User, который вставляется в Authorizer (то есть SecurityContext). В JAX-RS для авторизации обычно используется SecurityContext.
Для авторизации, если вы хотите защитить определенные области для определенных ресурсов, вы можете использовать аннотацию @RolesAllowed для своих классов или методов. Джерси поддерживает эту аннотацию путем регистрации RolesAllowedDynamicFeature.
Под капотом происходит то, что SecurityContext будет получено из запроса. В примере, на который я ссылаюсь, вы можете увидеть Authorizer, у него есть переопределенный метод isUserInRole. Этот метод будет вызываться для проверки значений в @RolesAllowed({"ADMIN"}). Поэтому, когда вы создаете SecurityContext, вы должны обязательно включить в переопределенный метод роли пользователя.
Для тестирования можно просто использовать браузер. Если все настроено правильно, при попытке доступа к ресурсу вы должны увидеть (в Firefox) диалоговое окно, как показано в этом сообщении< /а>. Если вы используете cURL, вы можете сделать
C:/>curl -v -u username:password http://localhost:8080/blah/resource
Это отправит запрос с базовой проверкой подлинности. Из-за переключателя -v вы должны увидеть все задействованные заголовки. Если вы просто хотите протестировать клиентский API, см. здесь как настроить. В любом из трех упомянутых случаев кодировка Base64 будет сделана за вас, так что вам не нужно об этом беспокоиться.
Что касается SSL, вы должны изучить документацию вашего контейнера для получения информации о том, как его настроить.
person
Paul Samsotha
schedule
02.02.2015