Yii framework 2 — права пользователя через базу данных.
Создаём контроллер от которого потом будут наследоваться все контроллеры и beforeAction — метод который будет выполняться перед экшеном.
P.S.: модели и CRUD должны быть сгенерированы при помощи модуля Gii.
Модель и таблица rights:
Модель и таблица users, особенность в том что там есть поле righgts:
В таблице users у нас есть возможность изменять поле rights которое отвечает за права доступа к действиям контроллеров.
В таблицу rights мы записываем: контроллер, экшен и роли (права,rights) которые имеют к ним доступ.
Алгоритм:
Права в таблице rights перечислять через запятую.
Данный способ хорошо использовать в модуле администратор, для пользовательской части подойдут стандартные права.
Я не мастер писать статьи и красиво выражаться, просто изложил техническую суть, поставьте пожалуйста плюс — напишу еще много всего интересного.
Создаём контроллер от которого потом будут наследоваться все контроллеры и beforeAction — метод который будет выполняться перед экшеном.
P.S.: модели и CRUD должны быть сгенерированы при помощи модуля Gii.
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace app\helper;
use yii\web\Controller;
use app\models\Users;
use app\models\Rights;
use Yii;
class AppController extends Controller{
public function beforeAction($action){
$controller = $action->controller->id;
//$action = $action->id;
$rights = Rights::find()->where('controller = :controller', [':controller' => $controller])->one();
if(is_null($rights)){
echo 'controller dont have a rights';
exit;
}
$roles = explode(",",$rights->rights);
$access = false;
$userRole = "guest";
if(!\Yii::$app->user->isGuest){
$id = \Yii::$app->user->id;
$user = Users::find()->where('id = :id', [':id' => $id])->one();
$userRole = $user->righgts;
}
foreach ($roles as $role){
if($role == $userRole){
$access = true;
}
}
if(!$access){
$this->redirect(array('/site/login'));
exit;
}
return parent::beforeAction($action);
}
}
Модель и таблица rights:
CREATE TABLE `rights` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`controller` varchar(255) NOT NULL,
`action` varchar(255) NOT NULL,
`rights` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=utf8
Модель и таблица users, особенность в том что там есть поле righgts:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`phone` varchar(22) NOT NULL,
`password` varchar(64) NOT NULL,
`righgts` varchar(60) NOT NULL,
`verify_key` varchar(65) NOT NULL,
`activated` int(11) NOT NULL,
`recovery_key` varchar(65) NOT NULL,
`recovery_key_life` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`auth_key` varchar(255) NOT NULL,
`accessToken` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=utf8
В таблице users у нас есть возможность изменять поле rights которое отвечает за права доступа к действиям контроллеров.
В таблицу rights мы записываем: контроллер, экшен и роли (права,rights) которые имеют к ним доступ.
Алгоритм:
- Родительский контроллер проверяет права пользователя из базы данных (колонка rights).
- Родительский контроллер получает название вызываемого контроллера и название вызываемого действия.
- Родительский контроллер обращается к таблице rights и проверяет какие права нужны для того что бы использовать вызываемый контроллер и действие.
- Если права пользователя совпадают с правами в таблице rights то действие выполняется, если нет то выполняется редирект.
Права в таблице rights перечислять через запятую.
Данный способ хорошо использовать в модуле администратор, для пользовательской части подойдут стандартные права.
Я не мастер писать статьи и красиво выражаться, просто изложил техническую суть, поставьте пожалуйста плюс — напишу еще много всего интересного.
Комментарии (8)
SEVNTEC
09.08.2019 15:31+1Права в таблице rights перечислять через запятую.
Какие интересные запросы получатся, для поиска юзеров с конкретной ролью. Решение не серьёзное
Sarymian
12.08.2019 09:36Полнотекстовый поиск — а разве это работает быстро? Разве бинарную логику не проще было бы использовать?
PaulZi
Чем вам стандартный модуль RBAC со хранением в базе не угодил?
Grindok
Он просто не осилил
vk13s
Согласен. может автору статьи показалось что стандартный RBAC сложен и он решил замутить свое, как бы простое