Я успешно создал веб-сервис REST с Джерси и обеспечил его с помощью аннотаций java-безопасности. Это выглядит как этотКак защитить ресурсы REST, чтобы доступ к нему мог получить только один пользователь роли?
GET /users/ // gives me all users
GET /users/{id} // gives the user identified by {id}
POST /users/ // creates user
PUT /users/{id} // updates user identified by {id}
DELETE /users/{id} // delete user
Я также настроить область с двумя ролями: пользователь и администратор
Я прикрепленная все методы так, что только администраторы могут получить доступ к ним.
Теперь я хочу дать бесплатно в PUT /users/{id}
и GET /users/{id}
методы, так что пользователи могут получить доступ к своим собственному и только своим собственным ресурсов.
Пример:
// user anna is logged in and uses the following methods
GET /users/anna // returns 200 OK
GET /users/pete // returns 401 UNAUTHORIZED
Поскольку я не мог найти способ, чтобы настроить это через аннотации, я имею в виду прохождение запроса HTTP к соответствующему методу, чтобы проверить, если пользователь имеет право на доступ к ресурсу.
Это будет выглядеть примерно так для метода GET /users/{id}
:
@GET
@Path("https://stackoverflow.com/users/{id}")
@RolesAllowed({"admin","user"})
@Produces(MediaType.APPLICATION_JSON)
public Response getUser(
@PathParam("id") String id,
@Context HttpServletRequest req
) {
HttpSession session = request.getSession(false);
if (session != null && session.getValue("userID").equals(id))
return getObject(User.class, id);
return Response.status(Status.UNAUTHORIZED).build();
}
Мне не нравится этот ПОДХОД, потому что я думаю, что я должен был бы добавить userID
Мануалы к сессии.
Знаете ли вы более элегантный способ решить эту проблему?
Если нет, то каким образом вы добавляете идентификатор пользователя в сеанс при использовании проверки подлинности на форме?
EDIT
Спасибо Уилл и Павел :) Вот мое окончательное решение:
@Context
private SecurityContext security;
// ...
@GET
@Path("https://stackoverflow.com/users/{id}")
@RolesAllowed({"admin","user"})
@Produces(MediaType.APPLICATION_JSON)
public Response getUser(@PathParam("id") String id){
if (security.isUserInRole("user"))
if (security.getUserPrincipal().getName().equals(id))
return getObject(User.class, id);
else
return Response.status(Status.UNAUTHORIZED).build();
else
return getObject(User.class, id);
}
или вы можете ввести SecurityContext, см. Http: // jersey. java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –
Спасибо, что за ваше понимание многое помогло. @Pavel спасибо, я теперь использую SecurityContext выглядит теперь потрясающе: D – Zounadire