Yii2-admin RBAC權限管理的實現

yii2-admin是yii2 rbac的一套管理工具,實現了漂亮的界面和完整的權限管理功能,不用本身再去寫權限代碼了,使用以前請將yii2的源碼更新到最新版本.php

git源碼地址:https://github.com/mdmsoft/yii2-admingit

安裝yii2-admin:github

一、首先切換到項目目錄下web

二、執行該語句:composer.phar require mdmsoft/yii2-adminsql

注:若是提示could not open input file composer.phar數據庫

請先執行下面兩條語句bootstrap

composer self-update
composer install --prefer-dist數組

三、composer完成後在項目下的配置文件中加入下列配置項yii2

'aliases' => [  
    '@mdm/admin' => '$PATH\yii2-admin-1.0.3',  
],  
'modules' => [  
    'admin' => [  
        'class' => 'mdm\admin\Module',  
  
        'layout' => 'left-menu', // it can be '@path/to/your/layout'.  
        /**/  
        'controllerMap' => [  
            'assignment' => [  
                'class' => 'mdm\admin\controllers\AssignmentController',  
                'userClassName' => 'app\models\User',  
                'idField' => 'id'  
            ]  
        ],  
        'menus' => [  
            'assignment' => [  
                'label' => 'Grand Access' // change label  
            ],  
            //'route' => null, // disable menu route  
        ]  
    ],  
    'debug' => [  
        'class' => 'yii\debug\Module',  
    ],  
],  
components數組中加入authManager組件,有PhpManager和DbManager兩種方式,PhpManager將權限關係保存在文件裏,這裏使用的是DbManager方式,將權限關係保存在數據庫.  
  
'authManager' => [  
        'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'  
],  
'i18n' => [  
        'translations' => [  
            '*' => [  
                'class' => 'yii\i18n\PhpMessageSource',  
                'basePath' => '@app/messages', // if advanced application, set @frontend/messages  
                'sourceLanguage' => 'en',  
                'fileMap' => [  
                    //'main' => 'main.php',  
                ],  
            ],  
        ],  
    ],  

4.命令行切換到yii2目錄,執行下面命令,建立rbac須要的表(需自行建立數據庫,庫名默認yii2basic)
    yii migrate --migrationPath=@yii/rbac/migrations
    yii migrate --migrationPath=@mdm/admin/migrations (建立menu導航菜單表),若是發生錯誤能夠將migrations中的sql文件移動到@yii/rbac/migrations目錄下生成表
上面的命令使用的yii2框架的cli模式,因此須要將上面的配置,在console.php中也寫一份,這個你們看錯誤提示就知道了.app

 

反正這步我是沒有執行成功的,這步的目的是在數據庫裏生成下面5個表:

menu
auth_rule            //規則,規則類名
auth_item_child    //角色對應的權限,parent角色,child權限名
auth_item            //角色|權限表,type=1角色,type=2權限
auth_assignment    //角色與用戶對應關係表

我經過下面SQL語句直接生成這5個表

SET FOREIGN_KEY_CHECKS=0;  
  
-- ----------------------------  
-- Table structure for yc_menu  
-- ----------------------------  
DROP TABLE IF EXISTS `yc_menu`;  
CREATE TABLE `yc_menu` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(128) NOT NULL,  
  `parent` int(11) DEFAULT NULL,  
  `route` varchar(256) DEFAULT NULL,  
  `order` int(11) DEFAULT NULL,  
  `data` text,  
  PRIMARY KEY (`id`),  
  KEY `parent` (`parent`),  
  KEY `name` (`name`),  
  KEY `route` (`route`(255)),  
  KEY `order` (`order`),  
  CONSTRAINT `dh_menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `dh_menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系統管理員菜單權限表\r\n';  
  
DROP TABLE IF EXISTS `yc_auth_rule`;  
CREATE TABLE `yc_auth_rule` (  
  `name` varchar(64) NOT NULL,  
  `data` text,  
  `created_at` int(11) DEFAULT NULL,  
  `updated_at` int(11) DEFAULT NULL,  
  PRIMARY KEY (`name`),  
  KEY `name` (`name`),  
  KEY `created_at` (`created_at`),  
  KEY `updated_at` (`updated_at`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理員權限規則表';  
  
DROP TABLE IF EXISTS `yc_auth_item_child`;  
CREATE TABLE `yc_auth_item_child` (  
  `parent` varchar(64) NOT NULL,  
  `child` varchar(64) NOT NULL,  
  PRIMARY KEY (`parent`,`child`),  
  KEY `child` (`child`),  
  KEY `parent` (`parent`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理員權限關係表';  
  
DROP TABLE IF EXISTS `yc_auth_item`;  
CREATE TABLE `yc_auth_item` (  
  `name` varchar(64) NOT NULL,  
  `type` int(11) NOT NULL,  
  `description` text,  
  `rule_name` varchar(64) DEFAULT NULL,  
  `data` text,  
  `created_at` int(11) DEFAULT NULL,  
  `updated_at` int(11) DEFAULT NULL,  
  PRIMARY KEY (`name`),  
  KEY `rule_name` (`rule_name`),  
  KEY `type` (`type`),  
  KEY `name` (`name`),  
  KEY `created_at` (`created_at`),  
  CONSTRAINT `yc_auth_item_ibfk_2` FOREIGN KEY (`rule_name`) REFERENCES `yc_auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理權權限條目';  
  
DROP TABLE IF EXISTS `yc_auth_assignment`;  
CREATE TABLE `yc_auth_assignment` (  
  `item_name` varchar(64) NOT NULL,  
  `user_id` varchar(64) NOT NULL,  
  `created_at` int(11) DEFAULT NULL,  
  PRIMARY KEY (`item_name`,`user_id`),  
  KEY `user_id` (`user_id`),  
  KEY `created_at` (`created_at`),  
  KEY `item_name` (`item_name`),  
  CONSTRAINT `yc_auth_assignment_ibfk_2` FOREIGN KEY (`item_name`) REFERENCES `yc_auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理員受權表';  

5.訪問管理界面,http://localhost/admin,這時因爲沒有數據,會報錯,咱們須要添加用戶表user
個人字段是這樣的,只需存在user_id便可,其餘字段根據須要自行增減

CREATE TABLE `user` (  
    `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `username` varchar(16) DEFAULT NULL,  
    `password` varchar(32) DEFAULT NULL,  
    `realname` varchar(32) DEFAULT NULL,  
    `email` varchar(32) DEFAULT NULL,  
    PRIMARY KEY (`user_id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

這是訪問可能還會報錯,由於咱們沒有實現驗證類,在配置文件web.php中的components加入user項

'user' => [  
        'identityClass' => 'app\models\User',  
        'enableAutoLogin' => true,  
    ],  

這裏的app\models\User是咱們實現的驗證類,你能夠隨便取名

class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface  
這個類需實現IdentityInterface接口中的5個函數,必須實現的有2個方法  
    findIdentity($id)    //根據id查詢用戶信息  
    getId()                //獲取用戶id  

到這裏,基本就完成了,訪問http://localhost/admin,便可看到管理界面

6.使用

1)修改導航菜單模板主視圖文件 views/layouts/main.php

use mdm\admin\components\MenuHelper;  
    use yii\bootstrap\Nav;  
  
    echo Nav::widget([  
            'options' => ['class' => 'navbar-nav navbar-right nav-pills '],  
            #修改使用yii2-admin的菜單控制項  
            'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id),  
        ]);  

2)進入yii2-admin的目錄,vi components/MenuHelper.php

public static function getAssignedMenu($userId, $root = null, $callback = null, $refresh = true) 將$refresh改成true  

3)添加導航菜,建立RULE, 建立角色

https://github.com/mdmsoft/yii2-admin/blob/master/docs/guide/basic-usage.md

建立RULE時,必須寫一個類並繼承yii\rbac\Rule,而且實現其抽象方法。

相關文章
相關標籤/搜索