我正在开发一个包含多种用户类型的管理面板。我创建了一个" 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;
}
}
请告诉我解决这个问题的最佳方法.... 谢谢。
答案 0 :(得分:0)
您正在寻找的是一种冒充另一个用户的方式。 https://github.com/dektrium/yii2-user似乎处理模仿(而非testet)。
如果我不得不这样做,我会制作一个superadmin按钮(或下拉列表)作为另一个代理商登录,将代理商用户ID存储在管理员的会话中,让你写的行为返回这个存储的代理商ID,如果可用,而不是null。