快速搭建php rbac后台

使用yii2的advance版本进行快速建站(rbac控制)

安装yii2 和 一些yii2的插件

建议使用composer方式进行操作

下载yii

composer create-project --prefer-dist yiisoft/yii2-app-advanced honglvshi.cn
cd honglvshi.cn 
php init
/*会出现两个选项 让你选择是生产环境 还是 开发环境 */

配置nginx

/*前台nginx配置*/
server{
  listen 80;
  server_name ******;
  root /data/www/develop/******/frontend/web;
  index index.php index.html;
  access_log /data/log/nginx/develop/******.access.log;
  error_log /data/log/nginx/develop/******.error.log;
  include php-fpm.conf;
}
/*后台nginx配置*/
server{
  listen 80;
  server_name ******;
  root /data/www/develop/******/backend/web;
  index index.php index.html;
  access_log /data/log/nginx/develop/******.access.log;
  error_log /data/log/nginx/******.error.log;
  include php-fpm.conf;
}

复制的时候注意删除注释 路径需要自己根据自己服务器进行配置

安装yii2 拓展

/*后台adminlte 响应式模版*/
composer require dmstr/yii2-adminlte-asset "2.*"
/*yii2-admin 官方可视化rbac管理组件*/
composer require mdmsoft/yii2-admin "2.x-dev"

修改yii2项目


/* 将adminlte的layout布局替换yii2原始的layout布局*/
cp -r yii2-app/* /data/www/develop/honglvshi.cn/backend/views/
/* 修改yii2 backend 的配置项*/
/*增加以下两个组件*/
'components' => [
    /*rbac 角色授权管理*/
    "authManager" => [
        "class" => 'yii\rbac\DbManager',
        "defaultRoles" => ["guest"],
    ],
    /* url美化 */
    "urlManager" => [
       'enablePrettyUrl' => true,
       'showScriptName' => false,
       'rules' => [
          ],
    ],
    'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=127.0.0.1;dbname=*****',
            'username' => '***',
            'password' => '****',
            'charset' => 'utf8',
        ]
],
/*模块增加以下代码 以后每增加一个模块 都需要再以下配置增加*/
"modules" => [
    "admin" => [
        "class" => "mdm\admin\Module",
    ],
],

/**/
"aliases" => [
    "@mdm/admin" => "@vendor/mdmsoft/yii2-admin",
],
'as access' => [
    'class' => 'mdm\admin\components\AccessControl',
    'allowActions' => [
        //目前允许访问所有action 强烈建议填写 登录 注销 和异常页面
        '*'
    ]
],

创建rbac的数据库

/*sql语句存在/vendor/yiisoft/yii2/rbac/migrations/shcema-mysql.sql*/
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
) engine InnoDB;

CREATE TABLE `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`),  
CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `auth_key` varchar(32) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `password_reset_token` varchar(255) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `role` smallint(6) NOT NULL DEFAULT '10',
  `status` smallint(6) NOT NULL DEFAULT '10',
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

进入http://admin.**/admin/route查看效果
这里写图片描述

大功造成了一半 嗯 继续往下

修改布局的左边菜单栏

<aside class="main-sidebar">
    <section class="sidebar">
        <div class="user-panel">
            <div class="pull-left image">
                <img src="<?= $directoryAsset ?>/img/user2-160x160.jpg" class="img-circle" alt="User Image"/>
            </div>
            <div class="pull-left info">
                <p>Alexander Pierce</p>
                <a href="#"><i class="fa fa-circle text-success"></i> Online</a>
            </div>
        </div>
        <form action="#" method="get" class="sidebar-form">
            <div class="input-group">
                <input type="text" name="q" class="form-control" placeholder="Search..."/>
                <span class="input-group-btn">
                <button type='submit' name='search' id='search-btn' class="btn btn-flat"><i class="fa fa-search"></i>
                </button>
              </span>
            </div>
        </form>
                <?php
                use mdm\admin\components\MenuHelper;
                $callback = function($menu){
                    $data = json_decode($menu['data'], true);
                    $items = $menu['children'];
                    $return = ['label' => $menu['name'],'url' => [$menu['route']]];
                    //处理我们的配置
                    if ($data) {
                        isset($data['visible']) && $return['visible'] = $data['visible'];//visible
                        isset($data['icon']) && $data['icon'] && $return['icon'] = $data['icon'];//icon
                        //other attribute e.g. class...
                        $return['options'] = $data;
                    }
                    //没配置图标的显示默认图标
                    (!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o';
                    $items && $return['items'] = $items;
                    return $return;
                };
                //这里我们对一开始写的菜单menu进行了优化
                echo dmstr\widgets\Menu::widget( [
                    'options' => ['class' => 'sidebar-menu'],
                    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id,null, $callback),
                ] );
                ?>
    </section>
</aside>

创建一个用户

在frontend的config/main.php 同样配置数据库

'components' => [
    /*rbac 角色授权管理*/
    /* url美化 */
    "urlManager" => [
       'enablePrettyUrl' => true,
       'showScriptName' => false,
       'rules' => [
          ],
    ],
    'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=127.0.0.1;dbname=*****',
            'username' => '***',
            'password' => '****',
            'charset' => 'utf8',
        ]
],
/*前台/site/signup 注册一个帐号 就可以再后台登录了*/
/admin/route rbac的路由
/admin/permission rbac的权限
/admin/role rbac的角色
/admin/assigment rbac的分配权限
/admin/menu rbac的菜单

先配置超级管理员的权限
进入****/admin/role/index
选中超级管理员
分配route给 /*
然后进入****/admin/assigment/index
分配超级管理员给我们刚创建的用户

这里写图片描述

1.先创建路由
2.在对路由创建权限(强烈建议对路由进行一对一分配权限)
3.在对权限一对多创建权限
4.在对角色分配权限
5.然后创建菜单
这里写图片描述
这里写图片描述
这里写图片描述

接下里可以根据用户和自己的模块进行rbac的分配了 如果不知道rbac是什么 最好百度或者google了解下rbac的系统
项目的前台在frontend进行编写代码
项目的后台在backend进行编写代码
再根据自己的其他需求自行选择compose框架

yii2 的advanced版本已经涵盖很多功能 基本你想要的yii2 advanced版本都涵盖了

这里写图片描述

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