在示例中,我有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'];
}
}
我的目标是只为具有RBAC角色“admin”的用户设置“secretAttributes”。 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]);
}
}
但是如何处理相关模型中的秘密属性? 如何在不访问模型中的会话的情况下过滤掉它?
答案 0 :(得分:0)
Yii2是强大的力量。
您要做的就是覆盖fields()
模型中的Invoice
函数。
public function fields()
{
$fields = parent::fields();
if (\Yii::$app->user->isGuest || !\Yii::$app->user->can('see-secret-stuff-rule')) {
unset($fields['secret_invoice'], $fields['other_sensitive_field'] /*, ... */);
}
return $fields;
}