因此,我正在尝试了解如何设计 REST 资源以及安全性如何融入这一切。我对 REST 和用户身份验证不太熟悉,所以请耐心等待 - 我确信这是一个非常愚蠢的问题。
现在我知道您可以为用户定义安全角色,并根据他们是否是管理员来限制对资源的访问。
令我感到困惑的是,我遇到了这样一种情况:某个用户(例如 1234)拥有订阅列表。现在只有用户 1234 应该能够访问他的订阅。
GET /user_id/1234/subscriptions
在这种情况下,使用角色没有任何意义,因为您必须为每个用户定义角色。我们是否必须通过在代码中进行某种检查来控制此访问权限,以确保该用户具有访问权限?例如:
@Path("/user_id/{user_id}/subscriptions")
@GET
public getSubscriptions(@PathParam("user_id" int user_id))
{
if(user_id == "some code here that checks what the user_id of the current user is")
{
return Response.ok(getUserSubscriptionsFromDB(user_id));
}
else
{
return Response.status(Status.UNAUTHORIZED).build();
}
}
这是应该如何完成的,还是我搞错了?如果这就是您的做法,那么“”中的实际代码会是什么样子?我要询问什么对象才能获得 user_id? [计划将来使用 OAUTH2 社交登录用于 google、facebook 等...但我也可能只使用基本身份验证]
最佳答案
你基本上是对的。此类授权的术语是基于权限/Activity 的授权,广泛用于对 RESTful 服务等资源的 CRUD 操作。
伪代码更像是这样的:
@Path("/users/{userId}/subscriptions")
@GET
public getSubscriptions(@PathParam("userId" int userId))
{
if(getSubject().isPermitted("subscriptions:read:"+userId)
{
return Response.ok(getUserSubscriptionsFromDB(userId));
}
else
{
return Response.status(Status.UNAUTHORIZED).build();
}
}
您可能想查看Apache Shiro它具有相当不错的基于权限的授权支持。
您可能还想了解命名 REST resources 的最佳实践。 .
关于java - 使用 Jersey 进行基于用户的访问的 REST 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324671/