我有三种不同的型号,分别是User、PermissionSet和Permission。这些模型分别表示它们的SQL表。
User有一个多对一关联PermissionSet,一个用户可以有一个PermissionSet,也可以没有。PermissionSet%s将归一个或多个User%s所有。
PermissionSet与Permission%s具有多对多关联。一个Permission可以由多个PermissionSet拥有,也可以不拥有,其中PermissionSet%s可以拥有多个Permission,也可以根本不拥有。
所以我创建了四个表:users、permission_sets、permissions和一个连接表permission_sets_permissions。
我需要持久化在User的PermissionSet中所做的更改,这是由一个名为PermissionSetGrant的模型处理的,该模型有自己的表permission_set_grants。
使用HTTP和JSON更改PermissionSet的Permission的最佳方式是什么?
例如,使用这样的请求修改PermissionSet是不是一个好方法:
PUT /api/v1/permission_sets/7
// Payload
{
"permission_set": {
// Assume these properties of the entity aren't changed
"name": "default",
"description": "Default permission set.",
// Here we're changing the permissions
"permission_ids": [
24,
27,
35
]
}
}
-> 200 OK或者使用额外的REST路径添加权限?
POST /api/v1/permission_sets/7/permissions
// Payload
{
"permission": 24
}
-> 201 CREATED当我们需要删除该权限时
DELETE /api/v1/permission_sets/7/permissions/24
-> 203 ACCEPTED我还想补充说,从客户端的角度来看,请求是幂等的和确定性的。权限数量至少为100个。因此,批处理操作将在第二种方法中执行。
发布于 2016-09-24 05:07:43
我认为您目前的解决方案还不错。如果您希望将权限与权限集连接起来,那么您可以使用多个If来描述集合,而不是使用相同的有效负载,例如
PUT /api/v1/permission_sets/1+2+3/permissions/4+5+6/
DELETE /api/v1/permission_sets/1+2+3/permissions/4+5+6/如果我是你,我不会坚持层次化的URI设计,这在大多数时候是不方便的。
PUT /api/v1/permissions/4+5+6/into/permission/sets/1+2+3/
DELETE /api/v1/permissions/4+5+6/from/permission/sets/1+2+3/请注意,URI设计没有REST约束,因为REST operates with hyperlinks和机器客户端。因此,从客户端的角度来看,URI具有什么结构并不重要,只要它可以用URI模板来描述即可。您必须记住的唯一一件事是,URI和资源之间存在n:1的关系,因此多个URI可以标识相同的资源,但单个URI不能标识多个资源。
发布于 2016-09-19 13:15:26
如果你打算允许一次更新这么多的权限,那么PATCH可能是你的朋友:
查看RFC 6902 (它定义了补丁标准),从客户端的角度来看,可以这样调用
PATCH /api/v1/permission_sets/7
[
{ "op": "add", "path": "/permission_ids", "value": [ "24", "27", "35" ]}
]然而,不幸的是,PATCH不是一个idempotent方法( POST也不是,因为几乎相同的显而易见的原因),所以排除后只剩下PUT,这很好,只是比PATCH (客户机必须PUT整个对象,包括permission_ids的整个集合)稍微冗长一点。
https://stackoverflow.com/questions/39558784
复制相似问题