Мы использовали последнюю альфа-структуру Yii2. Роль для пользователя, уже созданного, но проблема в том, как он назначается пользователю. Документация отсутствует.
Для версии базы данных RBAC используйте DbManager (quote frm: Alexufo):
use yii\rbac\DbManager; $r=new DbManager; $r->init(); $r->createRole("admin","Administrator"); $r->save(); $r->assign('1','admin'); //1 is user id
Пример Правила доступа:
<?php namespace backend\controllers; use yii; use yii\web\AccessControl; use yii\web\Controller; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ //'actions' => ['login', 'error'], // Define specific actions 'allow' => true, // Has access 'roles' => ['@'], // '@' All logged in users / or your access role eg 'admin', 'user' ], [ 'allow' => false, // Do not have access 'roles'=>['?'], // Guests '?' ], ], ], ]; } public function actionIndex() { return $this->render( 'index' ); } } ?>
Не забудьте добавить это в свой конфигурационный файл (config / main.php):
'components' => [ 'authManager'=>array( 'class' => 'yii\rbac\DbManager', 'defaultRoles' => ['end-user'], ), ... ]
Таблицы:
drop table if exists `tbl_auth_assignment`; drop table if exists `tbl_auth_item_child`; drop table if exists `tbl_auth_item`; create table `tbl_auth_item` ( `name` varchar(64) not null, `type` integer not null, `description` text, `biz_rule` text, `data` text, primary key (`name`), key `type` (`type`) ) engine InnoDB; create table `tbl_auth_item_child` ( `parent` varchar(64) not null, `child` varchar(64) not null, primary key (`parent`,`child`), foreign key (`parent`) references `tbl_auth_item` (`name`) on delete cascade on update cascade, foreign key (`child`) references `tbl_auth_item` (`name`) on delete cascade on update cascade ) engine InnoDB; create table `tbl_auth_assignment` ( `item_name` varchar(64) not null, `user_id` varchar(64) not null, `biz_rule` text, `data` text, primary key (`item_name`,`user_id`), foreign key (`item_name`) references `tbl_auth_item` (`name`) on delete cascade on update cascade ) engine InnoDB;
Вы также можете найти эту информацию в каталоге «yii / rbac» (включая другие файлы SQL). Для функциональности и более подробной информации:
https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md
$user_id = 1; $auth = new DbManager; $auth->init(); $role = $auth->createRole('editor'); $auth->add($role); $auth->assign($role, $user_id);
================================================== ========================= Если вы хотите выбрать роль вместо
$auth = new DbManager; $auth->init(); $role = $auth->getRole('admin'); $auth->assign($role, $user_id);
100% работали!
Решено!
================ ролевая роль ============
use yii\rbac\PhpManager; $r=new PhpManager; $r->init(); $r->createRole("admin","Администратор"); $r->save();
================= ================================================
$r->assign('1','admin'); //1 is user id
Очень простой способ добиться роли администратора – добавить это в свой контроллер:
use yii; /** * @inheritdoc */ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'actions' => ['index'], 'roles' => ['@'], ], [ 'allow' => !Yii::$app->user->isGuest && Yii::$app->user->identity->isAdmin(), 'actions' => ['view', 'create', 'update', 'delete'], ], ], ], ]; }
Затем добавьте в свою модель User
isAdmin()
которая возвращает true
для ваших пользователей (администраторов) и false
для всех остальных. Лично я использую:
public function isAdmin() { return Self::ROLE_ADMIN === $this->role; }
По общему признанию, это не «по книге». Но это просто, быстро и эффективно.
$user_id = \Yii::$app->user->id; $auth = new DbManager; $auth->init(); $role = $auth->createRole('editor'); $auth->add($role); $auth->assign($role, $user_id);