[英]REST GET endpoints returning different models based on user role
我目前正在處理一些基於權限返回不同類型模型的端點:
例如,我們的業務對象正在轉換為Model
或AdvancedModel
類型的對象。
public class Model
{
public int Property1 {get; set;}
}
public class AdvancedModel : Model
{
public int Property2 {get; set;}
}
public IActionResult Get()
{
(...)
return User.IsAdmin
? Mapper.Map<AdvancedModel>(Client);
: Mapper.Map<Model>(Client);
}
最初,這是為了每個人都可以檢索客戶的基本詳細信息(姓名...),但只有管理員才能訪問“敏感”信息(首選付款信息、帳單聯系人)。
這使得我們的 API 更難理解,因為我們需要根據權限級別確定返回哪些字段......這很有效,但我擔心隨着我們的擴展(新角色、端點)它會變得時髦。
我們已經考慮引入新的端點,但它會在我們已經打包的 API 中添加一堆端點。
/api/v1/admin/clients/1234
vs
/api/v1/clients/1234
我只是想知道處理這種情況的最佳做法是什么?
謝謝
我發現 REST api 根據訪問資源的人返回不同的內容可能會令人困惑。 當您接受PUT
更改時,這變得更加復雜。
我認為這不是一般性建議,因為不同的情況可能需要不同的解決方案,但在您的具體情況下,我認為擁有不同的資源更有意義。
可以在 API 中的 1 個以上點上表示“數據片段”,但是,您可以做的另一件事是考慮以下事項:
/clients/1234 <- could contain all the data
everyone may see.
/clients/1234/billing <- contains only the
billing information
admins can see.
我認為這也很好地體現了避免繼承和使用組合的想法。 您不需要Model
和AdvancedModel
。 您需要Model
和Billing
模型。
除了Evert發布的內容之外,您還可以使用不同的media types
來進行不同的響應。 media-type 也是支持 api 版本的好地方。
//fullrecord is only returned to admins
GET -H"accept=application/vnd.yourcompany.fullrecord.v1+json" /clients/1234
//fullrecord can also only be set by users with admin role
PUT -H"content-type=application/vnd.yourcompany.fullrecord.v1+json" /clients/1234
對於所有其他人
//this will just return public info
GET -H"accept=application/vnd.yourcompany.v1+json" /clients/1234
為客戶
//this will just return infos for logged in the client
GET -H"accept=application/vnd.yourcompany.client.v1+json" /clients/1234
這意味着具有 admin 角色的用戶可以通過設置適當的接受標頭來明確請求某個視圖。 它還導致更干凈的 URI 設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.