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实现链结人气统计
Oct 09 PHP
PHP 采集心得技巧
May 15 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
php学习之变量的使用
May 29 PHP
解析php中heredoc的使用方法
Jun 17 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
php输出xml属性的方法
Mar 19 PHP
php实现统计网站在线人数的方法
May 12 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
PHP的curl函数的用法总结
Feb 14 PHP
asp.net和php的区别点总结
Oct 10 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
Cannot modify header information错误解决方法
2008/10/08 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
Vuex 入门教程
2018/01/10 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
详解Python3注释知识点
2019/02/19 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
天网面试题
2013/04/07 面试题
医学生实习自荐信
2013/10/01 职场文书
校园安全教育广播稿
2014/02/17 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
小学亲子活动总结
2014/07/01 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
员工评语范文
2014/12/31 职场文书
2015公司年度工作总结
2015/05/14 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js