yii2检查行为中的用户角色并授予访问权限

时间:2017-04-17 13:04:18

标签: yii2 yii2-advanced-app yii2-user

我正在开发一个包含多种用户类型的管理面板。我创建了一个" AgencyBehaviour"对于可以更新自己数据的代理商 但我需要向所有代理商展示superadmin的所有数据。

我做了什么:

我正在检查当前用户是否是超级管理员,如果是superadmin,那么我将null值发送给AgencyBehaviour。

但是当超级管理员尝试插入或更新来自不同代理商的任何数据时,这不起作用。

AgencyBehavior.php

<?php

namespace app\components;

use Yii;
use yii\behaviors\AttributeBehavior;
use yii\db\BaseActiveRecord;

class AgencyBehavior extends AttributeBehavior {

private $agency_id;
public $value;

/**
 * @inheritdoc
 */
public function init() {
    parent::init();

    if (empty($this->attributes)) {
        $this->attributes = [
            BaseActiveRecord::EVENT_BEFORE_VALIDATE => 'agency_id',
        ];
    }
}

// return value of thsi method is set to the attribute attched to the event in the init. we can as well define the event handler
protected function getValue($event) {
    if ($this->value === null) {
        $user = Yii::$app->get('user', false);
        //Check for super admin user role
        $superAdminId = \app\models\Parameters::getValue('SYSTEM_USER_ID');

        if (yii::$app->user->identity->role_id == $superAdminId) {
             return null;
        }

        return ($user && !$user->isGuest) ? yii::$app->user->identity->agency_id : null;
    }

    return parent::getValue($event);
}

public function getAgency_id() {
    if ($this->agency_id === null) {
        $user = Yii::$app->get('user', false);
        $this->agency_id = $user && !$user->isGuest ? $user->agency_id : null;
        return $this->agency_id;
    }

    return parent::getValue($event);
}

public function setAgency_id($value) {
    $this->agency_id = $value;
}

}

请告诉我解决这个问题的最佳方法.... 谢谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找的是一种冒充另一个用户的方式。 https://github.com/dektrium/yii2-user似乎处理模仿(而非testet)。

如果我不得不这样做,我会制作一个superadmin按钮(或下拉列表)作为另一个代理商登录,将代理商用户ID存储在管理员的会话中,让你写的行为返回这个存储的代理商ID,如果可用,而不是null。