Security 如何保护REST资源,以便只有角色的单个用户可以访问它?

Security 如何保护REST资源,以便只有角色的单个用户可以访问它?,security,jakarta-ee,jersey,realm,Security,Jakarta Ee,Jersey,Realm,我已经成功地用Jersey创建了一个RESTWeb服务,并通过java安全注释对其进行了保护。 看起来像这样 GET/users///为我提供所有用户 GET/users/{id}//提供由{id}标识的用户 POST/users///创建用户 PUT/users/{id}//更新由{id}标识的用户 DELETE/users/{id}//DELETE user 我还设置了一个具有两个角色的领域:用户和管理员 我保护了所有方法,这样只有管理员才能访问它们 现在我想免费提供PUT/users/{

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

GET/users///为我提供所有用户
GET/users/{id}//提供由{id}标识的用户
POST/users///创建用户
PUT/users/{id}//更新由{id}标识的用户
DELETE/users/{id}//DELETE user
我还设置了一个具有两个角色的领域:用户和管理员

我保护了所有方法,这样只有管理员才能访问它们

现在我想免费提供
PUT/users/{id}
GET/users/{id}
方法,这样用户就可以访问自己的own自己的资源

例如:

//用户anna已登录并使用以下方法
GET/users/anna//返回200 OK
GET/users/pete//返回401个未经授权的
因为我找不到通过注释配置的方法,所以我考虑将HTTP请求传递给相应的方法,以检查是否允许用户访问资源

对于
GET/users/{id}
方法,它看起来像这样:

我不喜欢这个方法,因为我想我必须手动将
用户ID添加到会话中

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

  • 如果没有,那么在使用表单身份验证时,如何将userid添加到会话中

编辑

谢谢威尔和帕维尔:)这是我的最终解决方案:

@Context
私有安全上下文安全;
// ...
@得到
@路径(“/users/{id}”)
@允许角色({“管理员”,“用户”})
@产生(MediaType.APPLICATION_JSON)
公共响应getUser(@PathParam(“id”)字符串id){
if(security.isUserInRole(“用户”))
if(security.getUserPrincipal().getName().equals(id))
返回getObject(User.class,id);
其他的
返回Response.status(status.UNAUTHORIZED).build();
其他的
返回getObject(User.class,id);
}

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

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

阅读

阅读Google联邦登录、OAuth和OpenID


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

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

福佑极客更具体地提到了REST关于无状态事务和HTTP身份验证的使用方面。虽然这在REST体系结构的更大范围内是一个重要的问题,但它与您的特定问题不太相关,因为您没有指定针对Java EE应用程序使用的身份验证机制的类型,特别是因为身份验证在Java EE中是一个容器问题,而不是应用程序问题

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


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

嗨,极客:)谢谢您的回答。在我的例子中,这可能有点过头了,因为REST服务只由AJAX Web Fronted使用,它只有在您登录后才可访问。通过阅读您的答案,我不太明白为什么我需要一个身份验证框架。也许你可以多了解我的情况,举一两个例子来说服我:)。关于标题和cookie point,我还需要一些澄清。或者您可以插入SecurityContext,请参阅感谢您的帮助@Pavel也谢谢你我现在正在使用SecurityContext现在看起来棒极了:D
@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();
}