• 售前

  • 售后

热门帖子
入门百科

Laravel框架实现的rbac权限管理利用示例

[复制链接]
123456811 显示全部楼层 发表于 2021-10-26 13:35:04 |阅读模式 打印 上一主题 下一主题
本文实例陈诉了Laravel框架实现的rbac权限管理操纵。分享给大家供大家参考,具体如下:
先容:根据差别的权限,在菜单栏体现差别的功能,只对菜单进行了限定,若对路由也进行限定,请自行完善
1、建表(用户表、角色表、权限表、用户角色表、角色权限表)
  1. CREATE TABLE IF NOT EXISTS mr_role
  2. (
  3. id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  4. name varchar(30) NOT NULL COMMENT '角色名'
  5. )ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='角色表';
  6. CREATE TABLE IF NOT EXISTS mr_privilege
  7. (
  8. id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  9. name varchar(30) NOT NULL COMMENT '权限名',
  10. route varchar(50) NOT NULL COMMENT '权限所有的路由',
  11. description varchar(100) NOT NULL COMMENT '权限的描述'
  12. )ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='权限表';
  13. CREATE TABLE IF NOT EXISTS mr_user_role
  14. (
  15. id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  16. user_id int(11) NOT NULL COMMENT '用户id',
  17. role_id int(11) NOT NULL COMMENT '角色id'
  18. )ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='用户角色表';
  19. CREATE TABLE IF NOT EXISTS mr_role_privilege
  20. (
  21. id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id',
  22. role_id int(11) NOT NULL COMMENT '角色id',
  23. privilege_id int(11) NOT NULL COMMENT '权限id'
  24. )ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='角色权限表';
复制代码
2、在用户模子和角色模子中实现多对多
  1. class User extends Model
  2. {
  3.   protected $primaryKey = 'id';
  4.   protected $table = 'user';
  5.   public $timestamps = false;
  6.   public $guarded = [];
  7.   public function roles()
  8.   {
  9.     return $this->belongsToMany('App\Model\Role', 'user_role', 'user_id', 'role_id')->withPivot('user_id', 'role_id');
  10.   }
  11. }
  12. class Role extends Model
  13. {
  14.   protected $table = 'role';
  15.   protected $primaryKey = 'id';
  16.   public $timestamps = false;
  17.   public $guarded = [];
  18.   public function privileges()
  19.   {
  20.     return $this->belongsToMany('App\Model\Privilege', 'role_privilege', 'role_id', 'privilege_id')->withPivot(['role_id', 'privilege_id']);
  21.   }
  22. }
复制代码
3、将菜单视为公共区域,在app\Providers\AppServiceProvider.php里写
  1. public function boot()
  2. {
  3.     \View::composer('layout.slide', function($view) {
  4.       $roles_id = User::find(session('user')['id'])->roles->map(function ($role) {
  5.         return $role->id;
  6.       });  // 使用map,最终得到的结果$roles_id = [1, 2, ...]
  7.       $privileges = [];
  8.       foreach ($roles_id as $role) {
  9.         $privileges = array_merge($privileges, Role::find($role)->privileges->map(function ($privilege) {
  10.           return [$privilege->name, $privilege->route];
  11.         })->toArray());
  12.       }  // 得到的结果,$prpvileges = [['index/..', '列表'], ['', '']]
  13.       $view->with('privileges', $privileges);
  14.     });
  15. }
复制代码
4、菜单的实现(可以直接遍历一个div,我这里由于有差别的样式,便用了判定)
  1. @foreach ($privileges as $privilege)
  2.       @if ($privilege[1] == 'key/index' && $privilege[0] == '键名列表')
  3.         <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>
  4.       @endif
  5.       @if ($privilege[1] == 'key/create' && $privilege[0] == '添加键名')
  6.           <div class="slide__left__key"><a href="{{ url('key/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-plus"></span> 添加键名</a></div>
  7.       @endif
  8.       @if ($privilege[1] == 'project/index' && $privilege[0] == '项目列表')
  9.           <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>
  10.       @endif
  11.       @if ($privilege[1] == 'project/create' && $privilege[0] == '添加项目')
  12.           <div class="slide__left__key"><a href="{{ url('project/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-edit"></span> 添加项目</a></div>
  13.       @endif
  14.       @if ($privilege[1] == 'user/index' && $privilege[0] == '用户列表')
  15.           <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>
  16.       @endif
  17.       @if ($privilege[1] == 'user/create' && $privilege[0] == '添加用户')
  18.           <div class="slide__left__key"><a href="{{ url('user/create') }}" rel="external nofollow" ><span class="glyphicon glyphicon-plus-sign"></span> 添加用户</a></div>
  19.       @endif
  20.     @endforeach
复制代码
更多关于Laravel相干内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序筹划入门教程》、《php+mysql数据库操纵入门教程》及《php常见数据库操纵本事汇总》
渴望本文所述对大家基于Laravel框架的PHP程序筹划有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作