代码之家  ›  专栏  ›  技术社区  ›  Seb

REST获取基于用户角色返回不同模型的端点

  •  2
  • Seb  · 技术社区  · 6 年前

    我目前正在处理一些基于权限返回不同类型模型的端点:

    例如,我们的业务对象将转换为 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
    

    我只是想知道处理这种情况的最佳实践是什么?

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Evert    6 年前

    我发现,对于RESTAPI来说,根据访问资源的人返回不同的内容会变得很混乱。当您接受更改时,这会变得更加复杂 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 . 你两个都需要 模型 和A Billing 模型。

        2
  •  1
  •   jschnasse    6 年前

    除了张贴的内容 Evert ,您可以使用不同的 media types 对于不同的回答。媒体类型也是 支持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角色的用户可以通过设置适当的accept头显式地请求特定的视图。它还导致了一个更干净的URI设计。