Раньше друг спрашивал меня, как сделать rbac Yii. Когда я учился в колледже, я долгое время общался с ним. Это было бесполезно и забыто. Как раз в эти дни я был относительно празден. Я снова выдвинул свою общую идею, надеясь помочь Хану, который был пойман в ловушку в rbac Yii.~~
RBAC~~Что такое RBAC
Управление доступом на основе ролей Как перспективная альтернатива традиционному управлению доступом (автономный доступ, обязательный доступ), управление привлекло широкое внимание. В RBAC привилегии связаны с ролями, и пользователи получают привилегии этих ролей, становясь участниками соответствующих ролей. Это значительно упрощает управление привилегиями. В организации роли создаются для выполнения различных задач. Пользователям назначаются роли в соответствии с их обязанностями и квалификацией. Пользователи могут легко назначаться из одной роли в другую. Ролям могут быть предоставлены новые привилегии в зависимости от сочетания новых требований и систем, и при необходимости привилегии также могут быть восстановлены из роли. Взаимосвязь между ролями и ролями может быть установлена для охвата более широкого круга объективных ситуаций.
RBAC~~Процесс аутентификации с привилегиями
Проверка подлинности роли пользователя после входа пользователя в систему
Запросите список операций с привилегиями, выполняемых ролью, на основе роли
При доступе к привилегии (операции) определите, имеет ли пользователь возможность доступа
Как работает Yii? Здесь мы используем способ создания базы данных для достижения того, что это будет относительно безопасно.
RBAC~~генерация данных о привилегиях
Сначала настройте компоненты в web/console. php
'authManager' => [ 'class' => 'yii\rbac\DbManager', // auth_item (role permission) // auth_item_child (role->permission) // auth_assignment (user->role) // auth_rule (rule) 'itemTable' => '{{%auth_item}}', 'itemChildTable' => '{{%auth_item_child}}', 'assignmentTable' => '{{%auth_assignment}}', 'ruleTable' => '{{%auth_rule}}', ],
Затем используйте скрипт Yii для создания таблицы данных
./yii migrate [email protected]/rbac/migrations/
Затем нам нужно прочитать все контроллеры и методы и сохранить их в таблице привилегий, чтобы мы могли удобно читать базу данных для суждения.
public function actionInit() { $trans = Yii::$app->db->beginTransaction(); try { // Building Controller Directory $dir = dirname(dirname(__FILE__)). '/modules/controllers'; // Find all files in the controller directory $controllers = glob($dir. '/*'); $permissions = []; foreach ($controllers as $controller) { $content = file_get_contents($controller); // Find Controller preg_match('/class ([a-zA-Z]+)Controller/', $content, $match); $cName = $match[1]; $permissions[] = strtolower($cName. '/*'); // Regular matching of all actions in text preg_match_all('/public function action([a-zA-Z_]+)/', $content, $matches); foreach ($matches[1] as $aName) { $permissions[] = strtolower($cName. '/'. $aName); } } $auth = Yii::$app->authManager; // Why can $auth be manipulated to this table foreach ($permissions as $permission) { // Does this permission exist? if (!$auth->getPermission($permission)) { $obj = $auth->createPermission($permission); $obj->description = $permission; $auth->add($obj); } } $trans->commit(); echo "import success \n"; } catch(\Exception $e) { $trans->rollback(); echo "import failed \n"; } }
Затем вы можете сгенерировать данные разрешений в разделе Yii
./yii rbac/init
Затем посмотрите на базу данных
RBAC~~Контроль доступа с привилегиями
Принципы использования фильтров:
Фактически, контроль разрешений заключается в определении того, есть ли у текущего пользователя метод или нет. Перед этим разрешение на доступ контроллера должно быть аутентифицировано и отфильтровано фильтрами. Все контроллеры, включая Общий контроллер, автоматически получат доступ к методу поведения при доступе к контроллеру подкласса. В субконтроллере свойство родительского класса задается путем перезаписи атрибутов родительского класса. Подходы, которые обеспечивают доступ и, таким образом, выполняют роль фильтрации.
// Subclasses can be authenticated by rewriting this property public $mustlogin = ['createrule', 'createrole', 'roles', 'assignitem']; // Behavior filter public function behaviors() { return [ 'access' => [ 'class' => \yii\filters\AccessControl::className(), 'user' => 'admin', 'only' => $this->actions, 'except' => $this->except, 'rules' => [ [ 'allow' => false, 'actions' => empty($this->mustlogin) ? [] : $this->mustlogin, 'roles' => ['?'], ], [ 'allow' => true, 'actions' => empty($this->mustlogin) ? [] : $this->mustlogin, 'roles' => ['@'], ], ], ], ]; } // So how to realize access to determine whether the user has permission? Yii provides beforeaction for judging in Common Controller /* Access Judgment*/ public function beforeAction($action) { // Calling parent methods to prevent overwriting if (!parent::beforeAction($action)) { return false; } // Get the current controller $controller = $action->controller->id; $actionName = $action->id; if (Yii::$app->admin->can($controller. '/*')) { return true; } if (Yii::$app->admin->can($controller. '/'. $actionName)) { return true; } Throw new yii web Unauthorized HttpException ('Sorry, you don't have access to'. $controller.'/'. $actionName.'privileges'); // return true; } // In this way, access control of privileges can be realized.
До сих пор мы осознавали важность разрешения доступа. Далее нам нужно отобразить разные меню для разных пользователей. Как мы можем этого достичь?
Принцип: Сохраните строку меню в виде массива и определите, имеет ли контроллер доступа текущего пользователя соответствующие привилегии, распространив массив.
controller->id; $action = Yii::$app->controller->action->id; // Loop menu foreach (Yii::$app->params['adminmenu'] as $menu) { $show = "hidden"; if (Yii::$app->admin->can($menu['module']. '/*')) { $show = "show"; } else { if (empty($menu['submenu']) && !Yii::$app->admin->can($menu['url'])) { continue; } else { foreach ($menu['submenu'] as $sub) { // Determine whether the current user has access to the controller if (Yii::$app->admin->can($menu['module']. '/'. $sub['url'])) { $show = "show"; } } } } ?>
Таким образом, отображаются разные меню разных пользователей, входящих в систему.
RBAC~~Создает Разные Роли
Принцип: Разные роли имеют разные привилегии. Суперадминистраторы могут создавать пользователей и назначать привилегии разным пользователям. Во – первых, нам нужно иметь пользователя ->.
/* Role addition*/ public function actionCreaterole() { if (Yii::$app->request->isPost) { // DBmanager object $auth = Yii::$app->authManager; // Create a role object $role = $auth->createRole(null); $post = Yii::$app->request->post(); if (empty($post['name']) || empty($post['description'])) { Throw new Exception ('parameter error'); } $role->name = $post['name']; $role->description = $post['description']; $role->ruleName = empty($post['rule_name']) ? null : $post['rule_name']; $role->data = empty($post['data']) ? null : $post['data']; if ($auth->add($role)) { Yii: $app - > session - > setFlash ('info','add success'); } } return $this->render('_createitem'); }
Принцип: Так называемое распределение привилегий заключается в том, чтобы назначить пользователям доступ к контроллеру, подтверждая, что объект, который должен быть выделен, на самом деле является значением item_name, соответствующим идентификатору пользователя указанной таблицы.
Как это сделать? Смотри сюда – >
/* Allocation of authority*/ public function actionAssignitem($name) { // Acquire roles $name = htmlspecialchars($name); $auth = Yii::$app->authManager; // Get information about the current role $parent = $auth->getRole($name); if (Yii::$app->request->isPost) { $post = Yii::$app->request->post(); if (Rbac::addChild($post['children'], $name)) { Yii: $app - > session - > setFlash ('info','successful allocation'); } } $children = Rbac::getChildrenByName($name); // Getting the current user's $roles = Rbac::getOptions($auth->getRoles(),$parent); // Get the permissions that the current user has $permissions = Rbac::getOptions($auth->getPermissions(), $parent); return $this->render('_assignitem', ['parent' => $name, 'roles' => $roles, 'permissions' => $permissions, 'children' => $children]); }
RBAC~~указание правил, более расширенное указание разрешений
Далее я должен рассказать о правилах rbac. Что это? Так называемые правила на самом деле являются дополнительными ограничениями прав пользователя. Принцип: Определяя классы правил, можно добиться дополнительных ограничений прав пользователей, указав имена правил при добавлении пользователей. В таблице данных поле данных является экземпляром объекта пользовательского класса правил
Например, мы определяем такой пользовательский класс правил
/* Implementing classification can only be deleted by adders*/ class AuthorRule extends Rule { public $name = "isAuthor"; // Current users, permissions, additional parameters public function execute($user, $item, $params) { $action = Yii::$app->controller->action->id; // Additional restrictions on delete methods if ($action == 'delete') { // Getting the current category is added by that user and not allowed to be deleted by other users $cateid = Yii::$app->request->get("id"); $cate = Category::findOne($cateid); return $cate->adminid == $user; } return true; } }
Как мы создадим это правило в таблице данных?
/* Create rules*/ public function actionCreaterule() { if (Yii::$app->request->isPost) { $post = Yii::$app->request->post(); if (empty($post['class_name'])) { Throw new Exception ('parameter error'); } // Specify the current rule namespace $className = "app\models\". $post['class_name']; if (!class_exists($className)) { Throw new Exception ('rule class does not exist'); } $rule = new $className; // Save the current rule class to the database using the authManager component if (Yii::$app->authManager->add($rule)) { Yii: $app - > session - > setFlash ('info','add success'); } } return $this->render("_createrule"); }
Таким образом, при добавлении пользователей можно указать правила и указать более расширенные разрешения.
До сих пор мы в основном завершили создание пользователей, распределение привилегий и назначение правил. Я надеюсь, что это поможет вам всем.~~