2011-01-12 3 views
12

Я хостинг веб-службы REST в приложении Grails, используя Spring Security, т.е .:Вызов REST веб-службы, прикрепленную с Spring Security с Android

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

Я звоню его из Android приложения. (Вызов незащищенной службы работает очень хорошо.)

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

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

  1. Выполните вход один раз, чтобы восстановить JSESSION_ID, затем добавить заголовок, содержащий его в HttpUriRequest для каждого последующего запроса?
  2. Или (не знаю, как я бы даже сделать это), включают имя пользователя и пароль непосредственно на каждый запрос, предшествующее печенье/серверный сеанс

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

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

ответ

10

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

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

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

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

+4

Большое спасибо за ответ, это было близко (идеи очень помогли), но не работали из коробки - я сделал сообщение о том, что нужно, чтобы заставить его работать: http://storypodders.com/dasBlog/2011/01/22/SecuringRESTServicesInGrailsWithSpringSecurity.aspx – Bobby

+0

Это был отличный пост, спасибо за его вклад, я уверен, он будет найден и полезен многим другим. –

+12

Ввод имени пользователя и пароля в URL-адрес обычно считается плохой идеей. В файлах журналов Webserver часто содержатся параметры запроса, которые отображают ваши учетные данные. Любой, кто обращается к вашему RESTful-сервису из браузера, будет иметь учетные данные в своей истории. – Patrick

9

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

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

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

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

Смежные вопросы