Yii framework 2 custom rights

от автора

Yii framework 2 — права пользователя через базу данных.

Создаём контроллер от которого потом будут наследоваться все контроллеры и beforeAction — метод который будет выполняться перед экшеном.

PS: модели и 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 которое отвечает за права доступа к действиям контроллеров.

image

В таблицу rights мы записываем: контроллер, экшен и роли (права,rights) которые имеют к ним доступ.

image

Алгоритм:

  1. Родительский контроллер проверяет права пользователя из базы данных (колонка rights).
  2. Родительский контроллер получает название вызываемого контроллера и название вызываемого действия.
  3. Родительский контроллер обращается к таблице rights и проверяет какие права нужны для того что бы использовать вызываемый контроллер и действие.
  4. Если права пользователя совпадают с правами в таблице rights то действие выполняется, если нет то выполняется редирект.

Права в таблице rights перечислять через запятую.

Данный способ хорошо использовать в модуле администратор, для пользовательской части подойдут стандартные права.

Я не мастер писать статьи и красиво выражаться, просто изложил техническую суть, поставьте пожалуйста плюс — напишу еще много всего интересного.


ссылка на оригинал статьи https://habr.com/ru/post/463057/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *