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 相关文章推荐
快速配置PHPMyAdmin方法
Jun 05 PHP
PHP分页显示制作详细讲解
Nov 19 PHP
PHP 变量类型的强制转换
Oct 23 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php 操作符与控制结构
Mar 07 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP批量删除jQuery操作
Jul 23 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
laravel model 两表联查示例
Oct 24 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
用header 发送cookie的php代码
2007/03/16 PHP
PHP array_push 数组函数
2009/12/26 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
英语教学课后反思
2016/02/15 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python