У меня есть веб-приложение, которое должно позволить пользователям, использующим различные веб-клиенты (браузер, собственное мобильное приложение и т. Д.), Регистрироваться. После входа они могут получить доступ к ограниченному контенту или своему собственному контенту (например, к создаваемым им записям и т. Д.).
То, что я сделал до сих пор: я создал веб-сервис jax-rs rest (я размещаю свое приложение на glassfish), который предоставляет следующие методы:
- регистрация - пользователь POST выбирает желаемое имя пользователя, пароль, адрес электронной почты и т. Д .; если имя пользователя / адрес электронной почты уникальны, запись для этого пользователя создается в базе данных (я использую Hibernate для персистентности)
- логин - имя пользователя и пароль пользователя POST. Если они в порядке, UUID создается и возвращается пользователю (это будет использоваться в качестве токена для будущих запросов). У меня есть таблица с именем logedusers, с userID, токеном, 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();
}
}
Однако что произойдет, если у меня будет больше методов, предоставляющих данные, если они вызываются действительным пользователем?
Я должен был бы сделать эту проверку в начале каждого метода.
Я хочу сделать этот процесс авторизации прозрачным
Итак, два основных вопроса здесь:
- Этот дизайн в порядке? Все аутентифицируется с помощью user / pass, сервер создает и сохраняет и отправляет токен пользователю, пользователь отправляет токен на будущие запросы.
- Что мне делать, если у меня много конечных точек, которые должны определить личность вызывающего пользователя? Могу ли я пометить их некоторыми аннотациями, использовать своего рода провайдера / аутентификатора безопасности (где я могу добавить свою собственную логику для проверки - например, проверить, не является ли токен старше 5 дней и т. Д.).
Спасибо