欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

YII2框架中使用RBAC對模塊,控制器,方法的權(quán)限控制及規(guī)則的使用示例

 更新時(shí)間:2020年03月18日 10:23:49   作者:懷素真  
這篇文章主要介紹了YII2框架中使用RBAC對模塊,控制器,方法的權(quán)限控制及規(guī)則的使用,結(jié)合實(shí)例形式分析了YII2框架RBAC對模塊,控制器,方法的權(quán)限控制及規(guī)則的使用相關(guān)原理與操作技巧,需要的朋友可以參考下

本文實(shí)例講述了YII2框架中使用RBAC對模塊,控制器,方法的權(quán)限控制及規(guī)則的使用。分享給大家供大家參考,具體如下:

在使用YII2中自帶的RBAC時(shí),需要先配置config/web.php:

return [
  // ...
  'components' => [
    'authManager' => [
      'class' => 'yii\rbac\DbManager',
    ],
    // ...
  ],
];

如果你需要運(yùn)行yii migrate來創(chuàng)建表,那么config/console.php也需要同上面一樣配置一下。

cmd進(jìn)入項(xiàng)目目錄,運(yùn)行如下命令:

yii migrate --migrationPath=@yii/rbac/migrations

你會(huì)發(fā)現(xiàn)在數(shù)據(jù)庫中創(chuàng)建了四張表

auth_assignment 角色與用戶的關(guān)聯(lián)表
auth_item 存放角色與權(quán)限,通過type字段區(qū)分
auth_item_child 存放角色與權(quán)限的上下級關(guān)系
auth_rule 規(guī)則表,用于擴(kuò)展權(quán)限功能

為了演示,我們在控制器下分別寫四個(gè)方法,分別用來創(chuàng)建權(quán)限,創(chuàng)建角色,指派角色,使用規(guī)則。

IndexController.php代碼如下:

<?php

namespace app\controllers;

use YII;
use app\models\MyUserLogin;
use app\rbac\UserUpdSelfRule;
use app\controllers\BaseController;

class IndexController extends BaseController
{

  //首頁
  public function actionIndex()
  {
    $this->renderPartial('index');
  }

  //登陸
  public function actionLogin()
  {
    if (YII::$app->request->isPost) {
      $user = new MyUserLogin();
      $user->load(YII::$app->request->post(), '');

      if ($user->login()) {
        echo '登陸成功';
      } else {
        echo '登陸失敗';
      }

    } else {
      return $this->renderPartial('login');
    }
  }

  //為了演示,這里我們添加幾條權(quán)限
  public function actionPer()
  {
    $auth = YII::$app->authManager;
    //創(chuàng)建用戶刪除權(quán)限
    $per = $auth->createPermission('user/del');
    $per->description = '刪除用戶';
    $auth->add($per);
    //創(chuàng)建用戶更新權(quán)限
    $per = $auth->createPermission('user/upd');
    $per->description = '更新用戶';
    $auth->add($per);
    //創(chuàng)建用戶添加權(quán)限
    $per = $auth->createPermission('user/add');
    $per->description = '添加用戶';
    $auth->add($per);
    //創(chuàng)建用戶查看權(quán)限
    $per = $auth->createPermission('user/list');
    $per->description = '查看用戶列表';
    $auth->add($per);
  }

  //添加角色
  public function actionRole()
  {
    $auth = YII::$app->authManager;

    //添加管理員角色
    $admin = $auth->createRole('admin');
    $admin->description = '管理員';
    $auth->add($admin);
    //給管理員賦予權(quán)限
    $auth->addChild($admin, $auth->getPermission('user/del'));
    $auth->addChild($admin, $auth->getPermission('user/upd'));
    $auth->addChild($admin, $auth->getPermission('user/add'));
    $auth->addChild($admin, $auth->getPermission('user/list'));

    //添加普通員工角色
    $employee = $auth->createRole('employee');
    $employee->description = '普通員工';
    $auth->add($employee);
    $auth->addChild($employee, $auth->getPermission('user/list'));
    $auth->addChild($employee, $auth->getPermission('user/add'));
  }

  //給用戶指派角色
  public function actionAssign()
  {
    $auth = YII::$app->authManager;

    //注意這里的2是用戶的ID,即你用戶表user里的ID
    //也可通過YII::$app->user->id獲取
    $auth->assign($auth->getRole('admin'), 1);

    $auth->assign($auth->getRole('employee'), 2);
  }

  //添加規(guī)則
  public function actionRule()
  {
    $auth = YII::$app->authManager;
    $rule = new UserUpdSelfRule();
    $auth->add($rule);

    //創(chuàng)建權(quán)限,與規(guī)則關(guān)聯(lián)
    $per = $auth->createPermission('user/upd/updSelf');
    $per->description = '用戶只能修改自已';
    $per->ruleName = $rule->name;
    $auth->add($per);

    //這里,要注意,要把user/upd/updSelf權(quán)限設(shè)為user/upd的父級
    //要不然,普通員工訪問user/upd這個(gè)方法會(huì)被攔住
    $auth->addChild($per, $auth->getPermission('user/upd'));
    //給普通員工賦予user/upd/updSelf權(quán)限,注意我們這里并沒有給員工賦予user/upd權(quán)限
    $auth->addChild($auth->getRole('employee'), $per);
  }
}

我們在項(xiàng)目目錄下創(chuàng)建rbac目錄,并創(chuàng)建UserUpdSelfRule.php,來實(shí)現(xiàn)用戶只能修改自已信息的規(guī)則。

<?php

//注意命名空間要跟你的目錄對應(yīng)
namespace app\rbac;

use yii\rbac\Rule;

//必須繼承自yii\rbac\Rule
class UserUpdSelfRule extends Rule
{
  public $name = 'userUpdSelf';

  //必須要實(shí)現(xiàn)execute方法
  //$user表示用戶ID
  //$item規(guī)則相關(guān)的角色或者權(quán)限
  //$params傳遞過來的參數(shù)
  public function execute($user, $item, $params)
  {
    //如果沒有設(shè)置參數(shù)ID,直接返回true
    if (!isset($params['id'])) {
      return true;
    }
    //判斷id是否是當(dāng)前用戶ID
    return ($params['id'] == $user) ? true : false;
  }
}

我們訪問index/per查看數(shù)據(jù)表中的變化。

訪問index/role結(jié)果如下:

訪問index/assign結(jié)果如下:

訪問index/rule結(jié)果如下:

為了能夠?qū)ξ覀兊哪K,控制器,方法進(jìn)行權(quán)限控制,我們需要?jiǎng)?chuàng)建一個(gè)基類來統(tǒng)一處理,上面的控制器就是繼承自基類。

BaseController.php代碼如下:

<?php

namespace app\controllers;

use YII;
use yii\web\Controller;

class BaseController extends Controller
{
  //不需要驗(yàn)證的
  protected $noCheckAccess = [
    'index/index',
    'index/per',
    'index/role',
    'index/assign',
    'index/rule',
    'index/login',
  ];

  //不需要登陸的
  protected $noLogin = [
    'index/login',
  ];

  //驗(yàn)證權(quán)限
  //注意,不要把獲取模塊名,控制器名,方法名寫到init()函數(shù)里,那樣是獲取不到的
  //這個(gè)坑我已經(jīng)踩了,大家就不用再去踩了
  public function beforeAction($action)
  {
    $mid = !empty($this->module->id) ? $this->module->id : '';
    $cid = !empty($this->id) ? $this->id : '';
    $aid = !empty($action->id) ? $action->id : '';

    //如果模塊為basic,我們只驗(yàn)證控制器/方法
    if ($mid == 'basic') {
      $per = "{$cid}/{$aid}";
    } else {
      $per = "{$mid}/{$cid}/{$aid}";
    }

    if (!in_array($per, $this->noLogin)) {
      if (!$this->checkOnline()) {
        $this->redirect('index/login');
      }
    }

    if (!in_array($per, $this->noCheckAccess)) {
      if (!YII::$app->user->can($per)) {
        die('你沒有權(quán)限');
      }
    }

    return parent::beforeAction($action);
  }

  //檢查是否在線
  public function checkOnline()
  {
    return !empty(YII::$app->user->id) ? true : false;
  }
}

為了演示,我們創(chuàng)建一個(gè)UserController.php,代碼如下:

<?php

namespace app\controllers;

use YII;
use app\controllers\BaseController;

class UserController extends BaseController
{
  public function actionUpd()
  {
    $id = YII::$app->request->get('id', 0);

    echo 'user id : ', YII::$app->user->id, '<br>';

    //先判斷用戶有沒有只能修改自已的權(quán)限
    if (YII::$app->user->can('user/upd/updSelf')) {
      //然后再判斷修改ID是否與自已的ID一樣,在UserUpdSelfRule里進(jìn)行判斷
      if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) {
        echo '有權(quán)修改自已';
      } else {
        echo '不能修改除自已以外的';
      }
    } else {
      echo '修改所有';
    }
  }

  public function actionDel()
  {
    echo 'user id : ', YII::$app->user->id, '<br>';
    echo 'user del';
  }

  public function actionList()
  {
    echo 'user id : ', YII::$app->user->id, '<br>';
    echo 'user list';
  }

  public function actionAdd()
  {
    echo 'user id : ', YII::$app->user->id, '<br>';
    echo 'user add';
  }
}

我的用戶表里有兩個(gè)用戶

分別登陸這兩個(gè)用戶,然后讓他們訪問user/add,user/del,user/list,user/upd,結(jié)果如下:

admin用戶狀態(tài)如下:

test用戶狀態(tài)如下:

test之所以能夠訪問user/upd是因?yàn)槲覀儼製ser/upd/updSelf設(shè)為了user/upd的父級,如果沒有設(shè)置,這里是會(huì)被攔住的。

更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • PHP 結(jié)合 Boostrap 結(jié)合 js 實(shí)現(xiàn)學(xué)生列表刪除編輯及搜索功能

    PHP 結(jié)合 Boostrap 結(jié)合 js 實(shí)現(xiàn)學(xué)生列表刪除編輯及搜索功能

    這篇文章主要介紹了PHP 結(jié)合 Boostrap 結(jié)合 js 實(shí)現(xiàn)學(xué)生列表刪除編輯以及搜索功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • dvwa+xampp搭建顯示亂碼的問題及解決方案

    dvwa+xampp搭建顯示亂碼的問題及解決方案

    XAMPP是完全免費(fèi)且易于安裝的Apache發(fā)行版本,本文給大家介紹dvwa+xampp搭建顯示亂碼的問題及解決方案,需要的朋友可以參考下
    2015-08-08
  • TP5框架頁面跳轉(zhuǎn)樣式操作示例

    TP5框架頁面跳轉(zhuǎn)樣式操作示例

    這篇文章主要介紹了TP5框架頁面跳轉(zhuǎn)樣式操作,結(jié)合實(shí)例形式分析了TP5框架移動(dòng)設(shè)備支持及頁面跳轉(zhuǎn)樣式定義相關(guān)操作技巧,需要的朋友可以參考下
    2020-04-04
  • PHP獲取本周所有日期或者最近七天所有日期的方法

    PHP獲取本周所有日期或者最近七天所有日期的方法

    這篇文章主要介紹了PHP獲取本周所有日期或者最近七天所有日期的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • ThinkPHP5 框架引入 Go AOP,PHP AOP編程項(xiàng)目詳解

    ThinkPHP5 框架引入 Go AOP,PHP AOP編程項(xiàng)目詳解

    這篇文章主要介紹了ThinkPHP5 框架引入 Go AOP,PHP AOP編程,結(jié)合具體項(xiàng)目項(xiàng)目分析了ThinkPHP5 引入 Go AOP,PHP AOP編程相關(guān)概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • PHP實(shí)現(xiàn)rar解壓讀取擴(kuò)展包小結(jié)

    PHP實(shí)現(xiàn)rar解壓讀取擴(kuò)展包小結(jié)

    今天重點(diǎn)給大家介紹PHP 擴(kuò)展就是針對于 rar 的壓縮包操作,不過,PHP 的 rar 擴(kuò)展僅能讀取和解壓 rar 格式的壓縮包,并不能進(jìn)行壓縮操作,關(guān)于 rar 的壓縮操作并沒有找到太多有用的資料,下面通過本文一起學(xué)習(xí)下PHP rar解壓讀取知識(shí)吧
    2021-06-06
  • Yii CGridView用法實(shí)例詳解

    Yii CGridView用法實(shí)例詳解

    這篇文章主要介紹了Yii CGridView用法,結(jié)合實(shí)例形式分析了CGridView的功能、用法與相關(guān)屬性用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • thinkphp實(shí)現(xiàn)圖片上傳功能分享

    thinkphp實(shí)現(xiàn)圖片上傳功能分享

    圖片上傳在網(wǎng)站里是很常用的功能.ThinkPHP里也有自帶的圖片上傳類(UploadFile.class.php) 和圖片模型類(Image.class.php)。方便于我們?nèi)?shí)現(xiàn)圖片上傳功能,下面是實(shí)現(xiàn)方法
    2014-03-03
  • CodeIgniter框架基本增刪改查操作示例

    CodeIgniter框架基本增刪改查操作示例

    這篇文章主要介紹了CodeIgniter框架基本增刪改查操作,結(jié)合具體實(shí)例形式分析了CodeIgniter框架針對數(shù)據(jù)庫進(jìn)行創(chuàng)建、增刪改查等操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • php多功能圖片處理類分享(php圖片縮放類)

    php多功能圖片處理類分享(php圖片縮放類)

    本文提供的php類用于完成圖片縮放,水印添加,當(dāng)水印圖超過目標(biāo)圖片尺寸時(shí),水印圖能自動(dòng)適應(yīng)目標(biāo)圖片而縮小,當(dāng)水印圖超過目標(biāo)圖片尺寸時(shí),水印圖能自動(dòng)適應(yīng)目標(biāo)圖片而縮小,需要的朋友可以參考下
    2014-03-03

最新評論