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

Создаём контроллер от которого потом будут наследоваться все контроллеры и 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 которое отвечает за права доступа к действиям контроллеров.

image

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

image

Алгоритм:

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

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

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

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

Комментарии (8)


  1. PaulZi
    09.08.2019 09:37

    Чем вам стандартный модуль RBAC со хранением в базе не угодил?


    1. Grindok
      09.08.2019 10:22
      +2

      Он просто не осилил


    1. vk13s
      09.08.2019 14:41

      Согласен. может автору статьи показалось что стандартный RBAC сложен и он решил замутить свое, как бы простое


  1. Grindok
    09.08.2019 11:00

    Очередной шедевр гениального автора


  1. SEVNTEC
    09.08.2019 15:31
    +1

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

    Какие интересные запросы получатся, для поиска юзеров с конкретной ролью. Решение не серьёзное


  1. Mi7teR
    10.08.2019 13:09
    +1

    Люди плакались, кололись, но ленились прочитать в документации про RBAC


  1. SDKiller
    11.08.2019 11:17

    напишу еще много всего интересного

    не надо


  1. Sarymian
    12.08.2019 09:36

    Полнотекстовый поиск — а разве это работает быстро? Разве бинарную логику не проще было бы использовать?