Yii Framework 2自定义权限

Yii框架2-通过数据库的用户权限。

我们创建一个控制器,然后从该控制器继承所有控制器,并创建一个beforeAction-一个将在操作之前执行的方法。

PS:必须使用Gii模块生成模型和CRUD。

<?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); } } 

型号和权利表:

 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 

在model和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 

在用户表中,我们可以更改权限字段,该字段负责对控制器操作的访问权限。

图片

在权限表中,我们编写:有权访问它们的控制器,操作和角色(权限,权限)。

图片

算法:

  1. 父控制器从数据库中检查用户权限(“权限”列)。
  2. 父控制器获得被调用控制器的名称和被调用动作的名称。
  3. 父控制器访问权限表并检查需要哪些权限才能使用被调用的控制器和操作。
  4. 如果用户权限与权限表中的权限匹配,则执行操作;否则,执行重定向。

在权限表中列出权限,并用逗号分隔。

最好在管理员模块中使用此方法,因为用户部分的标准权限是合适的。

我不是写文章和表达美丽的大师,我只是概述了技术要点,请加分-我会写很多有趣的东西。

Source: https://habr.com/ru/post/zh-CN463057/


All Articles