【Yii2】Yii2使用yii2-admin做RBAC權限管理的安裝基本使用

RBAC 基於角色的權限管理

爲什麼要管理權限

在我們的系統中,存在不同的角色,每個角色對應的操作各不相同。

比如一個角色負責發佈文章,他的上級角色負責審覈文章,另一個上級則發佈文章和審覈文章的權限都有。

這時候就需要一個標準化的工作流來處理這些邏輯。

爲什麼是RBAC

像這種需求,在大部分管理系統都是存在的,經過一段時間的抽象化,大家便總結出了RBAC權限管理.

基本的邏輯

  • 一個用戶包含多個角色
  • 一個角色包含多個操作
  • 每個角色的操作允許相互重複

這樣就可以解決複雜業務邏輯下的權限分配問題。

爲什麼是yii2-admin

其實這部分的模塊是可以自己寫的,因爲RBAC權限管理在Yii2的框架內作爲基礎庫已經存在了。

而用yii2-admin的原因在於,不重複造輪子,或者說,不重複造不是很重要的輪子~

安裝

項目地址

推薦使用谷歌,第一個就是項目的github地址

https://github.com/mdmsoft/yii2-admin

安裝方式

第一種採用composer安裝

php composer.phar require mdmsoft/yii2-admin “~2.0”

第二種是直接下載源代碼,再通過別名的方式引入,爲了方便直接修改代碼,我這裏採用直接引入的方式。

config/web

'aliases' => [
        '@mdm/admin' => '@app/components/yii2-admin',
    ],    
'modules' => [
'admin' => [
            'class' => 'mdm\admin\Module',
            'layout' => 'left-menu',
            ],
    ],

創建對應數據表

這個數據表是Yii自帶的,文件位置爲 vendor/yiisoft/yii2/rbac/migrations/schma-mysql.sql

/**
 * Database schema required by \yii\rbac\DbManager.
 *
 * @author Qiang Xue <[email protected]>
 * @author Alexander Kochetov <[email protected]>
 * @link http://www.yiiframework.com/
 * @copyright 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 * @since 2.0
 */

drop table if exists `auth_assignment`;
drop table if exists `auth_item_child`;
drop table if exists `auth_item`;
drop table if exists `auth_rule`;

create table `auth_rule`
(
   `name`                 varchar(64) not null,
   `data`                 blob,
   `created_at`           integer,
   `updated_at`           integer,
    primary key (`name`)
) engine InnoDB;

create table `auth_item`
(
   `name`                 varchar(64) not null,
   `type`                 smallint not null,
   `description`          text,
   `rule_name`            varchar(64),
   `data`                 blob,
   `created_at`           integer,
   `updated_at`           integer,
   primary key (`name`),
   foreign key (`rule_name`) references `auth_rule` (`name`) on delete set null on update cascade,
   key `type` (`type`)
) engine InnoDB;

create table `auth_item_child`
(
   `parent`               varchar(64) not null,
   `child`                varchar(64) not null,
   primary key (`parent`, `child`),
   foreign key (`parent`) references `auth_item` (`name`) on delete cascade on update cascade,
   foreign key (`child`) references `auth_item` (`name`) on delete cascade on update cascade
) engine InnoDB;

create table `auth_assignment`
(
   `item_name`            varchar(64) not null,
   `user_id`              varchar(64) not null,
   `created_at`           integer,
   primary key (`item_name`, `user_id`),
   foreign key (`item_name`) references `auth_item` (`name`) on delete cascade on update cascade,
   key `auth_assignment_user_id_idx` (`user_id`)
) engine InnoDB;

使用

接下來訪問 http://localhost/admin/

這裏寫圖片描述

這裏我們可以看到

  • 分配角色
  • 角色列表
  • 權限管理
  • 規則管理

角色 - 用戶自己的表

這個在模塊的配置項中進行配置

這裏寫圖片描述

從上到下爲

用戶對應model,id的字段,用戶名字段,展示名的字段,自定義展示列配置

通過這個配置,我們就將RBAC和我們自己系統的聯繫在了一起。

配置權限管理默認角色默認權限

這個配置的作用是讓框架知道要採用的的權限配置方案。

中文

默認是顯示英文的,修改模塊文件

yii2-admin/Module.php

    public function init()
    {
        parent::init();
        if (!isset(Yii::$app->i18n->translations['rbac-admin'])) {
            Yii::$app->i18n->translations['rbac-admin'] = [
                'class' => 'yii\i18n\PhpMessageSource',
                'sourceLanguage' => 'en',
                'basePath' => '@mdm/admin/messages',
            ];
        }
        Yii::$app->language = 'zh-CN'; //模塊默認加載中文

        //user did not define the Navbar?
        if ($this->navbar === null && Yii::$app instanceof \yii\web\Application) {
            $this->navbar = [
                ['label' => Yii::t('rbac-admin', 'Help'), 'url' => ['default/index']],
                ['label' => Yii::t('rbac-admin', 'Application'), 'url' => Yii::$app->homeUrl],
            ];
        }
        if (class_exists('yii\jui\JuiAsset')) {
            Yii::$container->set('mdm\admin\AutocompleteAsset', 'yii\jui\JuiAsset');
        }
    }

使用自己的layout

後臺框架如果是自己寫的,那麼可能就會用自己寫的外部的layout,修改位置在web.php中的模塊配置中。

'admin' => [
            'class' => 'mdm\admin\Module',
            'layout' => 'left-menu',
            'mainLayout' => '@app/views/layouts/main_sys.php', //自己的layout
]

使用自己的layout出現的問題(重要)

原因:使用了自己layout文件,導致對應的bootstrap框架模塊中的圖標展示不出來,從而導致模塊內的操作按鈕展示不出來

解決方案:直接修改視圖文件,採用自定義按鈕

下面以item中的index.phpview舉例

<?php

use yii\helpers\Html;
use yii\grid\GridView;
use mdm\admin\components\RouteRule;
use mdm\admin\components\Configs;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */
/* @var $searchModel mdm\admin\models\searchs\AuthItem */
/* @var $context mdm\admin\components\ItemController */

$context = $this->context;
$labels = $context->labels();
$this->title = Yii::t('rbac-admin', $labels['Items']);
$this->params['breadcrumbs'][] = $this->title;

$rules = array_keys(Configs::authManager()->getRules());
$rules = array_combine($rules, $rules);
unset($rules[RouteRule::RULE_NAME]);

//自定義按鈕部分,其中的class是符合自己的條件
$buttons=[
    'view' => function ($url, $model, $key) {
        return Html::a("查看", [$this->context->id.'/view', 'id'=>$model->name], ['class' => "btn btn-success ", 'title' => '查看']);
    },
    'update' => function ($url, $model, $key) {
        return Html::a("修改", [$this->context->id.'/update', 'id'=>$model->name], ['class' => "btn btn-primary ", 'title' => '修改']);
    },
    'delete' => function ($url, $model, $key) {
        return Html::a("刪除", [$this->context->id.'/delete', 'id'=>$model->name], ['class' => "btn btn-danger ", 'title' => '刪除'
            ,'aria-label'=>'刪除','data-pjax'=>"0","data-confirm"=>"您確定要刪除此項嗎?","data-method"=>"post"]);
    },
];
$columns['buttons']=$buttons;

?>
<div class="role-index">
    <h1><?= Html::encode($this->title) ?></h1>
    <p>
        <?= Html::a(Yii::t('rbac-admin', 'Create ' . $labels['Item']), ['create'], ['class' => 'btn btn-success']) ?>
    </p>
    <?=
    GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            [
                'attribute' => 'name',
                'label' => Yii::t('rbac-admin', 'Name'),
            ],
            [
                'attribute' => 'ruleName',
                'label' => Yii::t('rbac-admin', 'Rule Name'),
                'filter' => $rules
            ],
            [
                'attribute' => 'description',
                'label' => Yii::t('rbac-admin', 'Description'),
            ],
            ['class' => 'yii\grid\ActionColumn',
                'buttons'=>$buttons], //自定義的按鈕
        ],
    ])
    ?>
</div>

權限控制

我們通過yii2-admin中封裝好的方法對訪問進行攔截

這裏我們寫一個父類,然後在對應的類中繼承它。

<?php

namespace app\common\controllers;

use Yii;
use yii\web\Controller;
use yii\web\HttpException;
use mdm\admin\components\Helper;

class RbacBaseController extends Controller
{
    public function beforeAction($action)
    {
        //沒有登錄則跳轉到登錄界面
        if (Yii::$app->user->isGuest) {
           return  $this->redirect(Yii::$app->urlManager->createUrl(Yii::$app->user->loginUrl));
        }

        $url = \Yii::$app->controller->module->id."/". \Yii::$app->controller->id."/".\Yii::$app->controller->action->id;

        //根據路由判斷權限,沒有權限則跳轉到錯誤頁面
        if(!Helper::checkRoute($url)){
            throw new HttpException(400,"你沒有權限",400);
        }
        return parent::beforeAction($action);
    }
}

其中後臺管理的根據用戶權限展示對應菜單也是通過這個方法做的。

關於錯誤頁面的自定義,本文不再展開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章