如何根据Yii2 REST API中的用户权限过滤扩展模型中的属性

时间:2018-02-05 14:40:54

标签: php rest yii2 filtering privileges

在示例中,我有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]);
    }
}

但是如何处理相关模型中的秘密属性? 如何在不访问模型中的会话的情况下过滤掉它?

1 个答案:

答案 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;
}