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);
}

最初这是为了让每个人都可以检索客户的基本详细信息(姓名...)而构建的,但只有管理员可以访问 "sensitive" 信息(首选付款信息、账单联系人)。

这使得我们的 API 更难理解,因为我们需要根据权限级别确定返回的字段...这很好用,但恐怕随着我们的扩展它会变得时髦(新角色、端点)。

我们考虑过引入新的端点,但它会在我们已经打包好的 API.

中添加一堆。
/api/v1/admin/clients/1234
vs
/api/v1/clients/1234

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

感谢

我发现 REST api 到 return 不同的东西可能会变得混乱,具体取决于谁在访问资源。当您接受 PUT.

的更改时,这会变得更加复杂

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

'piece of data' 可以在 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

这意味着具有管理员角色的用户可以通过设置适当的接受 header 来明确请求特定视图。它还会导致更清晰的 URI 设计。