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 相关文章推荐
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 PHP
linux下安装php的memcached客户端
Aug 03 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
PHP验证码生成原理和实现
Jan 24 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
php数组函数array_walk用法示例
May 26 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
PHP convert_cyr_string()函数讲解
Feb 13 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实现的返回数据格式化类实例
2014/09/22 PHP
网上抓的一个特效
2007/05/11 Javascript
一个用js实现控制台控件的代码
2007/09/04 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python三引号输出方法
2019/02/27 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
python中判断文件结束符的具体方法
2020/08/04 Python
详解python datetime模块
2020/08/17 Python
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
mysql序号rownum行号实现方式
2022/12/24 MySQL