我正在尝试找出在单页面应用程序中处理权限的正确方法,该应用程序直接与几个实现HATEOAS的RESTful API对话.
举个例子:
"作为我的应用程序的用户,我可以查看,启动和暂停作业,但不能阻止它们."
基础rest API具有以下资源:
/ jobs/{id}接受GET和PUT.GET返回作业模型,PUT接受作业模型作为请求体:
{ "_links" : { "self" : "/jobs/12345678" } "id" : 12345678, "description" : "foo job", "state" : "STOPPED" }
接受的工作状态可以是:休眠| 跑步| 暂停了| 停止.
要求说在UI上我必须有按钮:
开始,暂停,停止
...并且仅基于登录用户的权限进行显示.
从API的角度来看,一切都可以作为服务器上的底层逻辑,确保用户在发出请求时无法将状态更新为STOPPED状态(可能会返回401).
通知app/UI用户权限的最佳方法是什么,因此它可以隐藏用户无权操作的任何按钮?
如果API提供权限列表,可能类似于:
{ "_links" : { "self" : "/permissions", "jobs" : "/jobs" } "permissions" : { "job" : ["UPDATE", "DELETE"], "job-updates" : ["START", "PAUSE"] } }
或者应该更改API以便权限反映在HATEOS链接中可能类似于:
{ "_links" : { "self" : "/jobs/12345678", "start" : "/jobs/12345678/state?to=RUNNING", "pause" : "/jobs/12345678/state?to=PAUSED", } "id" : 12345678, "description" : "foo job", "state" : "DORMANT" }
还是应该以完全不同的方式完成?
UPDATE
我发现以下文章提出了一个答案:https: //softwareengineering.stackexchange.com/questions/215975/how-to-handle-fine-grained-field-based-acl-permissions-in-a-restful-服务
我会选择后者:根据存在的链接暗示权限.
如果链接不存在,则用户无法访问资源/执行操作.如果是,他们可以.这就是我要做的事情,因为它简单而干净,并且几乎没有前端代码的自由裁量权.解耦,哟.
或者,如果您确实希望在每个响应中包含所有链接但是明确指定允许哪些链接,哪些不允许,如果您使用HAL等格式来编写链接,则可以在每个链接上使用标记来扩展它,例如所以:
{ "_links" : { "self" : { "href":"/jobs/12345678", "allowed":false }, "start" : { "href":"/jobs/12345678/state?to=RUNNING", "allowed":false }, "pause" : { "href":"/jobs/12345678/state?to=PAUSED", "allowed":false } }, "id" : 12345678, "description" : "foo job", "state" : "DORMANT" }