【发布时间】:2020-09-12 16:33:00
【问题描述】:
在示例中,我有 ActiveRecords 模型 Client 和 Invoice。
class Client {
public function getInvoices()
{
return $this->hasMany(Invoice::class, ['id' => 'invoice_id']);
}
public function extraFields() : array
{
return ['invoices'];
}
}
class Invoice
{
public static function getSuperSecretAttributes()
{
// attributes visible only for users with specific RBAC roles
return ['secret_attribute'];
}
}
我的目标是设置“secretAttributes”仅对具有 RBAC 角色“admin”的用户可见。 对 API 的示例请求是:
http://somehost/clients/1?expand=invoices
{
"client_id" : 1,
// ...
"invoices" : [
{
"id" : 1,
// ...
"secret_attribute" : "foo"
}
]
}
我得到了客户端模型属性,其中包含“secret_attribute”的扩展发票。
通过覆盖/yii/rest/Serializer::serializeModel(),很容易从客户端过滤“secretAttributes”,示例伪代码:
if (! user-has-role(Rbac::ROLE_ADMIN)) {
foreach (model::getSuperSecretAttributes() as $attributeName) {
unset(model[$attributeName]);
}
}
但是如何处理相关模型中的秘密属性呢? 如何在不访问模型中的会话的情况下将其过滤掉?
【问题讨论】:
-
怎么样?在那里你只得到字符串“发票”,你可以过滤掉整个发票模型,而不是选择发票属性。对 Invoice 属性的访问在模型中的 toArray() 方法中,但它是模型,不应该触及用户会话。
标签: php rest yii2 filtering privileges