4

我已经成功地使用 Jersey 创建了一个 REST Web 服务,并通过 java 安全注释对其进行了保护。它看起来像这样

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}andGET /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("/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到会话中。

  • 你知道解决这个问题的更优雅的方法吗?

  • 如果不是,如何在使用表单身份验证时将用户 ID 添加到会话中?

编辑

谢谢 Will 和 Pavel :) 这是我的最终解决方案:

@Context
private SecurityContext security;

// ...
@GET
@Path("/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);
}
4

2 回答 2

3

在 中HttpServletRequest,您可以调用getRemoteUser()getUserPrincipal()来获取登录用户的身份。然后,您将继续像您正在做的那样专门允许或拒绝他们访问特定资源。

Blessed Geek 更具体地指的是 REST 方面关于无状态事务和 HTTP 身份验证的使用。虽然这在 REST 架构的更大范围内很重要,但它与您的特定问题的相关性较低,因为您没有指定针对 Java EE 应用程序使用的身份验证机制的类型,特别是因为身份验证是一个容器问题在 Java EE 中,不是应用程序问题。

如果您使用的是基本身份验证,那么您将使用 HTTP 标头来管理身份验证和授权。如果您使用基于表单的身份验证,那么容器将通过 servlet 会话为您管理它,使服务有状态(因为会话是有状态的工件)。

但这与您的具体问题无关。

于 2012-02-23T05:21:18.283 回答
0

部署 REST 最重要的方面之一是了解 http 标头和 cookie 的作用。

要使 REST 实用,您需要部署一个身份验证框架。

GWT 和 Google 文档 API

GWT-平台登录+会话管理

阅读 Google 联合登录、OAuth 和 OpenID。

如果在 OAuth 2.0 之前发布,我的一些解释可能已经过时。

于 2012-02-23T02:48:03.363 回答