我已经成功地使用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
我还设置了一个具有两个角色的领域:user和admin
我保护了所有方法,只有管理员才能访问它们。
现在我想免费提供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("/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
手动添加到会话中。
您是否知道更优雅的方法来解决这个问题?
如果不是,在使用表单身份验证时如何将userid添加到会话中?
修改
谢谢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);
}
答案 0 :(得分:2)
在HttpServletRequest
中,您可以调用getRemoteUser()
或getUserPrincipal()
来获取已登录用户的身份。然后,您将继续像专门允许或拒绝他们访问特定资源一样。
Blessed Geek更具体地指REST关于无状态事务和HTTP身份验证的使用方面。虽然这是REST架构较大范围内的重要一点,但由于您未指定用于Java EE应用程序的身份验证机制类型,因此它与您的特定问题不太相关,尤其是因为身份验证是容器问题在Java EE中,而不是应用程序问题。
如果您使用的是基本身份验证,那么您使用HTTP标头来管理身份验证和授权。如果您正在使用基于表单的身份验证,那么容器将通过servlet会话为您管理,使服务有状态(因为会话是有状态的工件)。
但这与您的具体问题无关。
答案 1 :(得分:0)
部署REST最重要的一个方面是了解http标头和cookie的作用。
要使REST实用,您需要部署身份验证框架。
读
GWT-Platform login + session management
阅读Google Federated Login,OAuth和OpenID。
我的一些解释可能已过时,如果它们是在OAuth 2.0之前发布的。