Laravel 用户权限管理

简介: 实现基于user,role,permission三表的权限管理因为一个用户可能拥有多种role,而一种role能同时被多个用户拥有。所以要建立多对多关系。

实现基于user,role,permission三表的权限管理
因为一个用户可能拥有多种role,而一种role能同时被多个用户拥有。所以要建立多对多关系。
参见文档

  1. 建立这三个表及关联表
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });

        Schema::create('permissions', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });

        Schema::create('permission_role', function (Blueprint $table) {
            $table->integer('permission_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('permission_id')
                  ->references('id')
                  ->on('permissions')
                  ->onDelete('cascade');

            $table->foreign('role_id')
                  ->references('id')
                  ->on('roles')
                  ->onDelete('cascade');

            $table->primary(['permission_id', 'role_id']);
        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->integer('role_id')->unsigned();
            $table->integer('user_id')->unsigned();

            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade');

            $table->foreign('role_id')
                  ->references('id')
                  ->on('roles')
                  ->onDelete('cascade');

            $table->primary(['user_id', 'role_id']);
        });
    }
  1. 建立模型关联

User模型

...
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
...

Role模型

class Role extends Model
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

    // $role = Role::first(); $p = Permission::first();  
    // $role->givePermission($p);
    public function givePermission(Permission $permission)
    {
        return $this->permissions()->save($permission);
    }
}

Permission模型

class Permission extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

  1. 添加记录,这里我们添加一个admin的role和名为edit_form的permission,并且让admin拥有edit_form权限。


    img_4dcbc6177bdf52540f345f09f9c47b3f.png
    image.png

执行完 $role->givePermission($permission);会发现permission_role表多了一条记录

img_bf837467527886b59426d6787e175edd.png
image.png

添加role和user的关系,将id为1的用户角色修改为admin。


img_18314e4d2a529f40405fea10a966c7e8.png
image.png

会发现role_user表多了一条记录


img_26ffb19af8812d6904e5b195ea8b0ce6.png
image.png

$user->roles()->detach($role); 可以删除这条记录
$user->roles()->attach($role); 新增记录

  1. 修改AuthServiceProvider.php,从数据库从读取所有的permission信息并设置Gate。让配置生效。
    public function boot()
    {
        $this->registerPolicies();

        // Gates 接受一个用户实例作为第一个参数,并且可以接受可选参数,比如 相关的 Eloquent 模型:
        foreach($this->getPermission() as $permission) {
            // dd($permission->roles);
            Gate::define($permission->name, function($user) use ($permission) {
                // 返回collection
                return $user->hasRole($permission->roles);
            });
        }

    }

    public function getPermission()
    {
        return Permission::with('roles')->get();
    }

给User模型添加hasRole方法

    public function hasRole($role)
    {
        if (is_string($role)) {
            return $this->roles->contains('name', $role);
        }

        // intersect 移除任何指定 数组 或集合内所没有的数值。最终集合保存着原集合的键:
        return !!$role->intersect($this->roles)->count();
    }
  1. 修改视图,测试,如果当前登录用户的id是1,就可以看到'编辑'链接
@can('edit_form')
<a href="#">编辑</a>
@endcan
  1. 总结

$this->roles() 与 $this->roles 有什么不同,什么情况下使用呢?
$this->roles() 返回 QueryBuilder ,$this->roles 返回一个 Collection

相关文章
|
前端开发 JavaScript 数据可视化
最棒的 7 个 Laravel admin 后台管理系统推荐
Laravel 已经凭借自己的易用性及低门槛成为 github 上 stars 第一的 PHP 框架,本文将介绍我精心为大家挑选出来的 Laravel admin 后台管理系统,从抽象程度最低(灵活但代码量大)到抽象程度最高(代码量小但不灵活)来帮助大家选择合适自己的 Laravel admin 后台管理系统。
2962 0
|
2月前
|
Shell 数据安全/隐私保护 Python
Django的用户的创建和修改密码
【10月更文挑战第17天】查找运行的django进程,使用python manage.py shell打开对应django进程
21 1
|
4月前
|
存储 数据安全/隐私保护 UED
|
6月前
|
API 数据安全/隐私保护 网络架构
在django3中配置应用的权限
【6月更文挑战第9天】该文档介绍了Django REST Framework的权限管理。总结来说,本文介绍如何设置严格项目权限和如何通过自定义权限控制对特定资源的访问。
61 10
在django3中配置应用的权限
|
6月前
|
监控 安全 Java
老程序员分享:JeeSite快速开发平台、功能介绍、用户权限、数据权限、系统管理
老程序员分享:JeeSite快速开发平台、功能介绍、用户权限、数据权限、系统管理
191 0
|
数据库 数据安全/隐私保护 Python
django数据库迁移和创建超级管理员
django数据库迁移和创建超级管理员
114 0
|
SQL 安全 关系型数据库
MySQL数据库(24):用户权限管理
MySQL数据库(24):用户权限管理
124 0
|
存储 中间件 数据安全/隐私保护
【laravel-admin】权限管理与实现原理
【laravel-admin】权限管理与实现原理
590 0
【laravel-admin】权限管理与实现原理
|
存储 关系型数据库 MySQL
|
Web App开发 关系型数据库 数据库
Django 搭建CMDB系统完整[1](用户登录)
***使用的mysql数据库,所以系统中要先安装mysql数据库 1、安装环境: pip install django python -m pip install --upgrade pip setuptools python -m pip insta...
2760 0