【问题标题】:REST GET endpoints returning different models based on user roleREST GET 端点根据用户角色返回不同的模型
【发布时间】:2018-12-25 06:24:30
【问题描述】:

我目前正在处理几个根据权限返回不同类型模型的端点:

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

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

谢谢

【问题讨论】:

  • 没有什么可以阻止您在响应中返回用户特定的数据。如何在内部管理这些取决于您或您使用的框架。 IE。基于 Java/Spring(生态系统)的解决方案可能会提供某些资源和资源组装器类,这些类仅支持您公开用户实际也可以访问的属性。 IMO 不需要特定的 uri 设计。

标签: rest api-design restful-architecture


【解决方案1】:

除了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 角色的用户可以通过设置适当的接受标头来明确请求某个视图。它还导致更简洁的 URI 设计。

【讨论】:

    【解决方案2】:

    我发现 REST api 根据访问资源的人员返回不同的内容可能会让人感到困惑。当您使用 PUT 接受更改时,这会变得更加复杂。

    我认为这不是一般性建议,因为不同的情况可能需要不同的解决方案,但在您的具体情况下,我认为拥有不同的资源更有意义。

    “一条数据”可以在 API 中的多个点上表示,但是,您可以做的另一件事是考虑以下几点:

    /clients/1234 <- could contain all the data
                     everyone may see.
    
    /clients/1234/billing <- contains only the
                             billing information
                             admins can see.
    

    我认为这也很好地体现了避免继承并改用组合的想法。您不需要ModelAdvancedModel。您需要ModelBilling 模型。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 2015-09-23
      • 2021-11-16
      • 1970-01-01
      • 2020-06-09
      • 2015-07-04
      • 1970-01-01
      • 2013-05-03
      相关资源
      最近更新 更多