zoukankan      html  css  js  c++  java
  • Yii2-admin RBAC权限管理的实现

    yii2-admin是yii2 rbac的一套管理工具,实现了漂亮的界面和完整的权限管理功能,不用自己再去写权限代码了,使用之前请将yii2的源码更新到最新版本.

    git源码地址:https://github.com/mdmsoft/yii2-admin

    安装yii2-admin:

    1、首先切换到项目目录下

    2、执行该语句:composer.phar require mdmsoft/yii2-admin

    注:如果提示could not open input file composer.phar

    请先执行下面两条语句

    composer self-update
    composer install --prefer-dist

    3、composer完成后在项目下的配置文件中加入下列配置项

    'aliases' => [  
        '@mdm/admin' => '$PATHyii2-admin-1.0.3',  
    ],  
    'modules' => [  
        'admin' => [  
            'class' => 'mdmadminModule',  
      
            'layout' => 'left-menu', // it can be '@path/to/your/layout'.  
            /**/  
            'controllerMap' => [  
                'assignment' => [  
                    'class' => 'mdmadmincontrollersAssignmentController',  
                    'userClassName' => 'appmodelsUser',  
                    'idField' => 'id'  
                ]  
            ],  
            'menus' => [  
                'assignment' => [  
                    'label' => 'Grand Access' // change label  
                ],  
                //'route' => null, // disable menu route  
            ]  
        ],  
        'debug' => [  
            'class' => 'yiidebugModule',  
        ],  
    ],  
    components数组中加入authManager组件,有PhpManager和DbManager两种方式,PhpManager将权限关系保存在文件里,这里使用的是DbManager方式,将权限关系保存在数据库.  
      
    'authManager' => [  
            'class' => 'yii
    bacDbManager', // or use 'yii
    bacDbManager'  
    ],  
    'i18n' => [  
            'translations' => [  
                '*' => [  
                    'class' => 'yiii18nPhpMessageSource',  
                    '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中也写一份,这个大家看错误提示就知道了.

    反正这步我是没有执行成功的,这步的目的是在数据库里生成下面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='系统管理员菜单权限表
    ';  
      
    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' => 'appmodelsUser',  
            'enableAutoLogin' => true,  
        ],  

    这里的appmodelsUser是我们实现的验证类,你可以随便取名

    class User extends yiidbActiveRecord implements yiiwebIdentityInterface  
    这个类需实现IdentityInterface接口中的5个函数,必须实现的有2个方法  
        findIdentity($id)    //根据id查询用户信息  
        getId()                //获取用户id  

    到这里,基本就完成了,访问http://localhost/admin,即可看到管理界面

    6.使用

    1)修改导航菜单模板主视图文件 views/layouts/main.php

    use mdmadmincomponentsMenuHelper;  
        use yiiootstrapNav;  
      
        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 bacRule,并且实现其抽象方法。

  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/qmsu/p/4585609.html
Copyright © 2011-2022 走看看