Laravel框架实现的rbac权限管理操作示例


Posted in PHP onJanuary 16, 2019

本文实例讲述了Laravel框架实现的rbac权限管理操作。分享给大家供大家参考,具体如下:

介绍:根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,请自行完善

1、建表(用户表、角色表、权限表、用户角色表、角色权限表)

CREATE TABLE IF NOT EXISTS mr_role
(
id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
name varchar(30) NOT NULL COMMENT '角色名'
)ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='角色表';
CREATE TABLE IF NOT EXISTS mr_privilege
(
id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
name varchar(30) NOT NULL COMMENT '权限名',
route varchar(50) NOT NULL COMMENT '权限所有的路由',
description varchar(100) NOT NULL COMMENT '权限的描述'
)ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='权限表';
CREATE TABLE IF NOT EXISTS mr_user_role
(
id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
user_id int(11) NOT NULL COMMENT '用户id',
role_id int(11) NOT NULL COMMENT '角色id'
)ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='用户角色表';
CREATE TABLE IF NOT EXISTS mr_role_privilege
(
id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
role_id int(11) NOT NULL COMMENT '角色id',
privilege_id int(11) NOT NULL COMMENT '权限id'
)ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='角色权限表';

2、在用户模型和角色模型中实现多对多

class User extends Model
{
  protected $primaryKey = 'id';
  protected $table = 'user';
  public $timestamps = false;
  public $guarded = [];
  public function roles()
  {
    return $this->belongsToMany('App\Model\Role', 'user_role', 'user_id', 'role_id')->withPivot('user_id', 'role_id');
  }
}
class Role extends Model
{
  protected $table = 'role';
  protected $primaryKey = 'id';
  public $timestamps = false;
  public $guarded = [];
  public function privileges()
  {
    return $this->belongsToMany('App\Model\Privilege', 'role_privilege', 'role_id', 'privilege_id')->withPivot(['role_id', 'privilege_id']);
  }
}

3、将菜单视为公共区域,在app\Providers\AppServiceProvider.php里写

public function boot()
{
    \View::composer('layout.slide', function($view) {
      $roles_id = User::find(session('user')['id'])->roles->map(function ($role) {
        return $role->id;
      });  // 使用map,最终得到的结果$roles_id = [1, 2, ...]
      $privileges = [];
      foreach ($roles_id as $role) {
        $privileges = array_merge($privileges, Role::find($role)->privileges->map(function ($privilege) {
          return [$privilege->name, $privilege->route];
        })->toArray());
      }  // 得到的结果,$prpvileges = [['index/..', '列表'], ['', '']]
      $view->with('privileges', $privileges);
    });
}

4、菜单的实现(可以直接遍历一个div,我这里因为有不同的样式,便用了判断)

@foreach ($privileges as $privilege)
      @if ($privilege[1] == 'key/index' && $privilege[0] == '键名列表')
        <div class="slide__left__key" style="margin-top: 10px;"><a href="{{ url('key/index') }}" rel="external nofollow" ><span class="glyphicon glyphicon-th"></span> 键名列表</a></div>
      @endif
      @if ($privilege[1] == 'key/create' && $privilege[0] == '添加键名')
          <div class="slide__left__key"><a href="{{ url('key/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-plus"></span> 添加键名</a></div>
      @endif
      @if ($privilege[1] == 'project/index' && $privilege[0] == '项目列表')
          <div class="slide__left__key" style="margin-top: 20px;"><a href="{{ url('project/index') }}" rel="external nofollow" ><span class="glyphicon glyphicon-th-list"></span> 项目列表</a></div>
      @endif
      @if ($privilege[1] == 'project/create' && $privilege[0] == '添加项目')
          <div class="slide__left__key"><a href="{{ url('project/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-edit"></span> 添加项目</a></div>
      @endif
      @if ($privilege[1] == 'user/index' && $privilege[0] == '用户列表')
          <div class="slide__left__key" style="margin-top: 20px;"><a href="{{ url('user/index') }}" rel="external nofollow" ><span class="glyphicon glyphicon-th-large"></span> 用户列表</a></div>
      @endif
      @if ($privilege[1] == 'user/create' && $privilege[0] == '添加用户')
          <div class="slide__left__key"><a href="{{ url('user/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-plus-sign"></span> 添加用户</a></div>
      @endif
    @endforeach

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
更改localhost为其他名字的方法
Feb 10 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
Smarty保留变量用法分析
May 23 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
php7 新增功能实例总结
May 25 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 #PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 #PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 #PHP
php成功操作redis cluster集群的实例教程
Jan 13 #PHP
PHP赋值的内部是如何跑的详解
Jan 13 #PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 #PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 #PHP
You might like
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
JS实现密码框效果
2020/09/10 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
javascript实现点击产生随机图形
2021/01/25 Javascript
Python pickle模块用法实例分析
2015/05/27 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
社团招新策划书
2014/02/04 职场文书
集中整治工作方案
2014/05/01 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
工程资料员岗位职责
2015/04/13 职场文书