jax-rs rest аутентификация и авторизация веб-службы

У меня есть веб-приложение, которое должно разрешать пользователям, использующим разные веб-клиенты (браузер, собственное мобильное приложение и т. Д.), Регистрироваться. После входа они могут получить доступ ограниченный контент или их собственный контент (например, записи, которые они создают и т. д.).

Что я сделал до сих пор: я создал веб-сервис jax-rs rest (я размещаю свое приложение на Glassfish), который предоставляет следующие методы:

  • register - пользовательский POST его желаемое имя пользователя / пароль / адрес электронной почты / и т. д.; если имя пользователя / адрес электронной почты уникальны, запись для этого пользователя создается в базе данных (я использую Hibernate для сохранения)
  • login - имя пользователя POST и Если они в порядке, создается UUID, который возвращается пользователю (он будет использоваться в качестве токена для будущих запросов).У меня есть таблица с именем logedusers с идентификатором пользователя, токеном, validSince в качестве столбцов.

Вот где меня это сбивает с толку.

Допустим, у меня есть другой метод, getUserEntries, который должен возвращать все записи, сделанные пользователем. Чтобы было понятнее, будет таблица Entry со следующими полями: entryId, userId, text.

Какой здесь подход лучше всего?

Что мне теперь делать: я делаю запрос на получение и передаю токен следующим образом:

localhost: 8080 / myApp / getUserEntries? Token = erf34c34

После этого, если токен действителен, я получаю userID из таблицы logedusers и на основе этого userId получить все записи и вернуть их как json.

Примерно так:

@GET
@Path("getUserEntries")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserEntries(@QueryParam("token") String token) {      
    String userId=getUserIdFromToken(token);
    if (userId == null){
        return Response.status(Response.Status.UNAUTHORIZED).build();
    } else {
        //get some data associated with that userId, put it in the response object and send it back
        return Response.ok().entity(response).build();
    }
}

Однако что произойдет, если у меня будет больше методов, которые предоставляют данные, если они вызываются допустимым пользователем?

Мне пришлось бы выполнять эту проверку в начале каждого метода.

Я хочу сделать этот процесс авторизации прозрачным

Итак, здесь два основных вопроса:

  1. Это нормально? Вся аутентификация с пользователем / проходом, сервер создает, хранит и отправляет токен пользователю, пользователь отправляет токен при будущих запросах.
  2. Что мне делать, если у меня много конечных точек, которым необходимо определить личность вызывающего пользователя? Могу ли я пометить их некоторыми аннотациями, использовать какой-то провайдер / аутентификатор безопасности (где я могу добавить свою собственную логику для проверки - например, проверить, не старше ли токен 5 дней и т. Д.).

Спасибо

7
задан Donal Fellows 15 January 2012 в 22:21
поделиться