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,并且实现其抽象方法。

  • 相关阅读:
    CSS自定义滚动条样式
    利用jquery和css打造个性化的单选框和复选框
    jQuery cookie 购物车及其实现
    php遍历数组 list foreach each方法总结
    css秘籍:复选框与文字对齐的问题
    Spring项目中的classpath路径
    idea快捷键盘Ctrl+H查看类的结构
    java中的反射机制(一)
    观察者设计模式
    Application context not configured for this file
  • 原文地址:https://www.cnblogs.com/qmsu/p/4585609.html
Copyright © 2011-2022 走看看