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连接mssql的一些相关经验及注意事项
Feb 05 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
PHP简单选择排序算法实例
Jan 26 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
PHP多维数组排序array详解
Nov 21 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
php语法检查的方法总结
2019/01/21 PHP
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
传播学专业毕业生自荐信
2013/11/04 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
岗位廉政承诺书
2014/03/27 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
市场策划求职信
2014/08/07 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书