因此,我试图了解如何设计我的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社交登录谷歌,脸书等....但我可能只是使用基本身份验证]
答案 0 :(得分:0)
你基本上做对了。此类授权的术语是基于权限/活动的授权,广泛用于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的最佳做法。