【发布时间】:2020-12-10 21:59:58
【问题描述】:
我有一个端点为GET /users/{id} 的API,它返回一个User 对象。 User对象可以包含cardLast4、cardBrand等敏感字段。
{
firstName: ...,
lastName: ...,
cardLast4: ...,
cardBrand: ...
}
如果用户使用自己的 ID 调用该端点,则所有字段都应该可见。但是,如果是其他人的 ID,则应隐藏 cardLast4 和 cardBrand。
我想知道这里设计我的回复的最佳做法是什么。我看到三个选项:
选项 1。两个 DTO,一个包含所有字段,一个不包含隐藏字段:
// OtherUserDTO
{
firstName: ...,
lastName: ..., // cardLast4 and cardBrand hidden
}
我可以看到这对于基于角色的 DTO 来说已经失控了,如果现在我有 UserDTOForAdminRole、UserDTOForAccountingRole 等等……看起来它很快就会随着潜在 DTO 的数量而失控。
选项 2。一个响应对象是 User,但将用户不应该看到的值清空。
{
firstName: ...,
lastName: ...,
cardLast4: null, // hidden
cardBrand: null // hidden
}
选项 3. 创建另一个端点,例如 /payment-methods?userId={userId},即使 PaymentMethod 不是我数据库中的实体。这现在需要 2 次 api 调用来获取所有数据。如果userId不是自己的,则返回403禁止。
{
cardLast4: ...,
cardBrand: ...
}
这里有哪些最佳做法?
【问题讨论】: