簡體   English   中英

實現HATEOAS的rest API的權限

[英]Permissions on a rest API implementing HATEOAS

我正在嘗試找出在單頁面應用程序中處理權限的正確方法,該應用程序直接與幾個實現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"
}

我會選擇后者。 我不喜歡前者的原因是因為您要為客戶創建額外的工作,要求它找出權限與它們允許訪問的資源之間的映射。 如果您使用hateoas並檢查是否存在關系類型,則服務器會為您完成此映射。 這也意味着uris可以在不打破客戶的情況下改變。

我最近寫了一篇關於這個領域的博客文章:

https://www.opencredo.com/2015/08/12/designing-rest-api-fine-grained-resources-hateoas-hal/

您應該使用表單而不是鏈接來提供狀態轉換超媒體。 如果您無法在媒體類型中提供表單,請提供指向使用支持表單的其他媒體類型(如XHTML)的URI的鏈接。

為此,IANA為create-formedit-formdelete-form提供了鏈接關系

另外,請不要使用startpause作為真正的鏈接關系。 如果您自己定義它們,它們必須是URI(最好是HTTP URL,但是您控制下的任何URI都可以)。 start與你正在使用它的含義完全不同,並且沒有定義pause

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM