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 05 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
php一些错误处理的方法与技巧总结
Aug 10 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
Jul 02 PHP
php经典算法集锦
Nov 14 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 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
短波问题解答
2021/02/28 无线电
PHPLog php 程序调试追踪工具
2009/09/09 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
ext jquery 简单比较
2010/04/07 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
vuex 的简单使用
2018/03/22 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
VUE实现吸底按钮
2021/03/04 Vue.js
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
浅谈python写入大量文件的问题
2018/11/09 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Django 框架模型操作入门教程
2019/11/05 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
Python用SSH连接到网络设备
2021/02/18 Python
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
英文自荐信
2013/12/19 职场文书
应届生自荐书
2014/06/23 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js