REST GET 端点根据用户角色返回不同的模型
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);
}
最初这是为了让每个人都可以检索客户的基本详细信息(姓名...)而构建的,但只有管理员可以访问 "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.
我认为这也很好地体现了避免继承并改用组合的想法。您不需要 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
这意味着具有管理员角色的用户可以通过设置适当的接受 header 来明确请求特定视图。它还会导致更清晰的 URI 设计。
我目前正在处理几个基于权限返回不同类型模型的端点:
例如,我们的业务对象正在转换为 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);
}
最初这是为了让每个人都可以检索客户的基本详细信息(姓名...)而构建的,但只有管理员可以访问 "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.
我认为这也很好地体现了避免继承并改用组合的想法。您不需要 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
这意味着具有管理员角色的用户可以通过设置适当的接受 header 来明确请求特定视图。它还会导致更清晰的 URI 设计。