2012-03-28 86 views
1

我正在嘗試構建一系列由各種內部系統使用的REST風格的服務。這些服務維護一個內部訪問控制系統,該系統確定用戶是否有權訪問特定資源上的操作。如何通過REST式服務表達訪問控制?

前端系統希望能夠測試用戶對指定資源的訪問權限,以便他們可以刪除依賴這些操作的用戶界面上的功能,因此他們不會發出發出請求服務會阻止。

如何將此訪問控制信息傳達給我的客戶?是否有任何約定用於表達您允許對任何指定資源執行的操作?

其目標是將足夠的信息傳遞給客戶端,以便他們應該知道他們可以對資源做出什麼類型的請求,而不會期待403響應。

編輯:

我想在我的資源加入「支持行動」,以鏈接:

<contact> 
    <addresses href="/contact/12345/addresses" actions="GET" /> 
</contact> 

如果調用程序的資源不能訪問,鏈接將不在文件中。

它確實強制我明確每個資源上可用的操作,並且客戶端必須在我提供的每個鏈接上讀取此信息,並且它不會輕鬆處理PUT請求(因爲您將指定你希望工作的URL)。

這是否合理?有沒有更好的習慣來實現這一目標?

編輯:

任何未來讀者的參考,我決定去把可用的操作上鍊接到現有資源,使主叫方不需要進行單獨的選項請求。

對於通過PUT請求創建新資源,這有點棘手,因爲資源還不存在以通過URL進行描述。在這種情況下,我決定用一個「孩子」鏈接,介紹了「添加」機制:

<contact> 
    <addresses href="/contact/12345/addresses" actions="GET"> 
     <add href="/contact/12345/addresses/[name]" actions="PUT"/> 
    </addresses> 
</contact> 

這是一個接近描述一個RPC風格的界面,但它描述的動作(以添加一個新資源作爲地址的子元素),並且它不在文檔中(在第一個示例中)將用於表示您無權訪問資源。

最重要的是,我將嘗試支持OPTIONS,以便客戶可以檢查逐個資源的基礎上是否有這種需求。

回答

1

我不知道任何REST約定查詢角色。

我會親自實現一個系統,在該系統中,我將向(例如)/users/johndoe/roles發出一個GET,並期望返回一個可用角色列表。

當然,該調用本身應該受到保護,只有指定的用戶和管理員才能檢索信息。

編輯:根據您的更多信息,你可能想看看the HTTP OPTIONS method(如果您的客戶端可以支持它。)如果您已經通過HTTP處理身份驗證和你想知道的HTTP方法是什麼(GET ,POST等)您可以在給定資源上執行,OPTIONS可用於將這些信息傳達給客戶。例如:

OPTIONS /resource HTTP/1.0 

HTTP/1.1 200 OK 
Date: Wed, 28 Mar 2012 14:44:47 GMT 
Allow: GET,HEAD,POST,OPTIONS,TRACE 
Content-Length: 0 
Connection: close 
+0

對不起,也許我不清楚:我不想傳達一個角色列表 - 我想傳達一個給定的資源,客戶端系統應該能夠用當前用戶上下文成功執行。 – 2012-03-28 13:37:58

+0

看我的編輯。儘管如此,我承認目前我的內容略微偏離了自己的觀點。 – zigg 2012-03-28 14:47:22

+0

HTTP選項明確提供了「允許」標題中的信息。我唯一關心的是這種方法需要一次往返才能獲取每個資源的訪問控制信息,並且如果您處理大量資源,那麼這種方法會非常昂貴。 – 2012-03-28 16:13:26