Подтвердить что ты не робот

Вызов веб-службы REST, защищенной с помощью Spring Безопасность с Android

Я размещаю веб-службу REST в приложении Grails, используя Spring Security, т.е.:

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def save = {
    println "Save Ride REST WebMethod called"
}

Я звоню из приложения для Android. (Вызов незащищенного сервиса работает нормально.)

Чтобы вызвать службу, я вручную создаю запрос (HttpUriRequest) и выполняю его с помощью HttpClient.

Мне интересно, что такое лучшие практики и как их реализовать... В частности, если я:

  • Выполните логин один раз, чтобы получить JSESSION_ID, а затем добавить заголовок, содержащий его в HttpUriRequest, для каждого последующего запроса?
  • Или (не уверен, как я это сделаю), включая логин и пароль непосредственно по каждому запросу, отказываясь от сеанса cookie/server-side

Я думаю, что могу получить вариант 1, но не уверен, что Spring Security разрешает (2), если это способ пойти... Спасибо!

- также нет никакой библиотеки, которую я пропускаю, чтобы все это для меня было?:)

4b9b3361

Ответ 1

Spring безопасность поддерживает как базовую аутентификацию, так и аутентификацию на основе форм (вложение имени пользователя/пароля в URL-адрес).

Служба REST обычно аутентифицируется по каждому запросу, обычно не по сеансу. По умолчанию проверка подлинности spring (при условии, что вы на 3.x) должна искать базовые параметры аутентификации или параметры формы (j_username и j_password) (в форме http://you.com/rest_service?j_username=xyz&j_password=abc).

Вручную привязать j_username/j_password к URL-адресу, добавив их в качестве параметров сообщения (я полагаю) или установив базовое имя пользователя/пароль для аутентификации, чтобы все работали для проверки подлинности службы REST против перехватчиков безопасности spring, сразу окна.

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

Ответ 2

Я думаю, вы можете использовать метод login-once-and-get-a-token, похожий на то, как работает oauth.

отправка имени пользователя и пароля по сети за пределами защищенного канала (https/ssl) - ужасная идея. любой в сети может обнюхать ваш пакет запросов и увидеть текстовый пароль.

с другой стороны, если вы используете метод токена, так как строка токена генерируется случайным образом, даже токен взломан, худший случай - кто-то может использовать токен, обращаясь к вашему REST API.

другое решение проходит через ssl tunnel (HTTPS). я действительно сделал сравнение, и результат показывает: 80 запросов/мин (https) против 300 запросов/мин (http)