Laravel框架实现的rbac权限管理操作示例
本文实例讲述了Laravel框架实现的rbac权限管理操作。分享给大家供大家参考,具体如下:
介绍:根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,请自行完善
1、建表(用户表、角色表、权限表、用户角色表、角色权限表)
CREATETABLEIFNOTEXISTSmr_role ( idint(11)PRIMARYKEYAUTO_INCREMENTCOMMENT'自增id', namevarchar(30)NOTNULLCOMMENT'角色名' )ENGINE=innodbDEFAULTCHARSET=utf8COMMENT='角色表'; CREATETABLEIFNOTEXISTSmr_privilege ( idint(11)PRIMARYKEYAUTO_INCREMENTCOMMENT'自增id', namevarchar(30)NOTNULLCOMMENT'权限名', routevarchar(50)NOTNULLCOMMENT'权限所有的路由', descriptionvarchar(100)NOTNULLCOMMENT'权限的描述' )ENGINE=innodbDEFAULTCHARSET=utf8COMMENT='权限表'; CREATETABLEIFNOTEXISTSmr_user_role ( idint(11)PRIMARYKEYAUTO_INCREMENTCOMMENT'自增id', user_idint(11)NOTNULLCOMMENT'用户id', role_idint(11)NOTNULLCOMMENT'角色id' )ENGINE=innodbDEFAULTCHARSET=utf8COMMENT='用户角色表'; CREATETABLEIFNOTEXISTSmr_role_privilege ( idint(11)PRIMARYKEYAUTO_INCREMENTCOMMENT'自增id', role_idint(11)NOTNULLCOMMENT'角色id', privilege_idint(11)NOTNULLCOMMENT'权限id' )ENGINE=innodbDEFAULTCHARSET=utf8COMMENT='角色权限表';
2、在用户模型和角色模型中实现多对多
classUserextendsModel { protected$primaryKey='id'; protected$table='user'; public$timestamps=false; public$guarded=[]; publicfunctionroles() { return$this->belongsToMany('App\Model\Role','user_role','user_id','role_id')->withPivot('user_id','role_id'); } } classRoleextendsModel { protected$table='role'; protected$primaryKey='id'; public$timestamps=false; public$guarded=[]; publicfunctionprivileges() { return$this->belongsToMany('App\Model\Privilege','role_privilege','role_id','privilege_id')->withPivot(['role_id','privilege_id']); } }
3、将菜单视为公共区域,在app\Providers\AppServiceProvider.php里写
publicfunctionboot() { \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_idas$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($privilegesas$privilege) @if($privilege[1]=='key/index'&&$privilege[0]=='键名列表')键名列表