Общим способом аутентификации с использованием имени пользователя и пароля является использование Basic Authentication. В основном клиенту необходимо отправить заголовок запроса Authorization
, а значение заголовка - Basic Base64Encoded(username:password)
. Так мое имя пользователя является peeskillet
и мой пароль pass
, я, как клиент, должны установить заголовок, как
Authorization: Basic cGVlc2tpbGxldDpwYXNz
В среде сервлетов, контейнер должен иметь поддержку для обычной проверки подлинности. Вы настроили эту поддержку на web.xml. Вы можете увидеть пример в 48.2 Securing Web Applications учебника Java EE. Вы также заметите в примере
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
Это для поддержки SSL. Это рекомендуется для базовой проверки подлинности.
Если вы не хотите иметь дело с проблемами, связанными с доменами безопасности и модулями входа, модулем и т. Д., Которые потребуются для настройки поддержки сервлетов или если вы просто не находитесь в среде сервлетов , реализация Basic Auth в ContainerRequestFilter
действительно не слишком сложна.
Вы можете увидеть полный пример того, как это можно сделать при jersey/examples/https-clientserver-grizzly. Вы должны сосредоточиться на SecurityFilter
Основной поток в фильтре идет что-то вроде этого
Получить заголовок Authorization
. Если этого не существует, введите AuthenticationException
. В этом случае AuthenticationExceptionMapper
будет посылать заголовок "WWW-Authenticate", "Basic realm=\"" + e.getRealm() + "\"
, который является частью протокола Basic Auth
После того, как у нас есть заголовок, разбираемого это просто, чтобы получить кодировкой Base64 логин: пароль. Затем мы расшифруем его, затем разделим, а затем разделим имя пользователя и пароль. Если какой-либо из этих процессов выходит из строя, снова введите WebApplicationException
, который отображает 400 Bad Request.
Проверьте имя пользователя и пароль. Исходный код примера просто проверяет, является ли имя пользователя user
, а пароль password
, но вы хотите использовать некоторую услугу в фильтре для проверки этой информации. Если какой-либо из них терпят неудачу, бросают AuthenticationException
Если все идет хорошо, А User
создается из метода authenticate
, и вводится в Authorizer
(который является SecurityContext
). В JAX-RS обычно используется для авторизации SecurityContext
.
Для авторизации, если вы хотите, чтобы обеспечить определенную области для определенных ресурсов, вы можете использовать @RolesAllowed
аннотации для классов или методов. Джерси поддерживает эту аннотацию, registering the RolesAllowedDynamicFeature
.
Что происходит под капотом, так это то, что SecurityContext
будет получен из запроса. С примером, с которым я связан, вы можете видеть Authorizer
, он имеет переопределенный метод isUserInRole
. Этот метод будет вызываться для проверки на значение (ы) в @RolesAllowed({"ADMIN"})
. Поэтому, когда вы создаете SecurityContext
, вы должны обязательно включить в переопределенный метод, роли пользователя.
Для тестирования вы можете просто использовать браузер. Если все настроено правильно, при попытке доступа к ресурсу вы должны увидеть (в Firefox) диалоговое окно, как показано в this post. Если вы используете cURL, вы могли бы сделать
C:/>curl -v -u username:password http://localhost:8080/blah/resource
Это будет посылать запрос Basic Authenticated. Из-за переключателя -v
вы должны увидеть все задействованные заголовки. Если вы просто хотите протестировать клиентский API, вы можете увидеть here, как его настроить. В любом из трех упомянутых случаев кодировка Base64 будет выполнена для вас, поэтому вам не придется беспокоиться об этом.
Что касается SSL, вы должны заглянуть в документацию своего контейнера для получения информации о том, как его настроить.
Взгляните на http://stackoverflow.com/questions/10826293/restful-authentication-via-spring – Hannes