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 перечислять через запятую.
Данный способ хорошо использовать в модуле администратор, для пользовательской части подойдут стандартные права.
Я не мастер писать статьи и красиво выражаться, просто изложил техническую суть, поставьте пожалуйста плюс — напишу еще много всего интересного.
