簡體   English   中英

REST GET 端點根據用戶角色返回不同的模型

[英]REST GET endpoints returning different models based on user role

我目前正在處理一些基於權限返回不同類型模型的端點:

例如,我們的業務對象正在轉換為ModelAdvancedModel類型的對象。

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.

我認為這也很好地體現了避免繼承和使用組合的想法。 您不需要ModelAdvancedModel 您需要ModelBilling模型。

除了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.

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