2012-02-23 4 views
5

Я успешно создал веб-сервис 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); 
} 

ответ

2

В HttpServletRequest, вы можете позвонить по телефону: getRemoteUser() или getUserPrincipal(), чтобы узнать о себе, когда они вошли в систему. Затем вы продолжаете, как вы делаете, в частности, разрешая или запрещая им доступ к конкретному ресурсу.

Blessed Geek более конкретно относится к аспекту REST относительно транзакций без учета состояния и использования аутентификации HTTP. Хотя это важный момент в большей области архитектуры REST, это менее актуально для вашего конкретного вопроса, поскольку вы не указываете тип механизма проверки подлинности, который вы используете против вашего приложения Java EE, тем более, что аутентификация представляет собой проблему с контейнером в Java EE, а не проблема приложения.

Если вы используете базовую аутентификацию, вы используете HTTP-заголовки для управления аутентификацией и авторизацией. Если вы используете аутентификацию на основе форм, то контейнер управляет этим для вас через сеанс сервлета, делая службу работоспособной (поскольку сеансы являются артефактом с сохранением состояния).

Но это не имеет никакого отношения к вашему конкретному вопросу.

+1

или вы можете ввести SecurityContext, см. Http: // jersey. java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –

+0

Спасибо, что за ваше понимание многое помогло. @Pavel спасибо, я теперь использую SecurityContext выглядит теперь потрясающе: D – Zounadire

0

Одним из наиболее важных аспектов развертывания REST является понимание роли HTTP заголовков и файлы cookie.

Для того, чтобы REST был практичным, вам необходимо развернуть систему аутентификации.

Читать

GWT and Google Docs API.

GWT-Platform login + session management

Читайте на Google Федеративные Логин, OAuth и OpenID.

Некоторые из моих объяснений могут быть устаревшими, если они были опубликованы до OAuth 2.0.

+0

Hi Geek :) Благодарю вас за ответ. Возможно, в моем случае это немного перебор, так как служба REST используется только AJAX Web-Fronted, доступ к которой возможен только после того, как вы вошли в систему. Прочитав ваши ответы, я не совсем понял, зачем мне нужен интерфейс аутентификации. Может быть, вы могли бы дать мне более глубокое понимание, зайдя в мое дело еще немного и сделайте один или два примера, чтобы убедить меня :). Что касается заголовков и точки печенья, мне также может потребоваться разъяснение. – Zounadire

+0

http://stackoverflow.com/questions/9425884/different-browser-means-a-different-client-from-the-same-machine/9426183#9426183 –