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错误、异常处理机制(补充)
May 07 PHP
php中引用符号(&amp;)的使用详解
Nov 13 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
php实现微信公众号无限群发
Oct 11 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 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 高手之路(一)
2006/10/09 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
使用javascipt---实现二分查找法
2013/04/10 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
Python getopt模块处理命令行选项实例
2014/05/13 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Sanic框架流式传输操作示例
2018/07/18 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
普师专业个人自荐信范文
2013/11/26 职场文书
立志成才演讲稿
2014/09/04 职场文书
采购内勤岗位职责
2015/04/13 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
Python实现为PDF去除水印的示例代码
2022/04/03 Python
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android