专栏首页finleyMaLaravel 用户权限管理

Laravel 用户权限管理

实现基于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权限。

image.png

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

image.png

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

image.png

会发现role_user表多了一条记录

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Angular ngIf 跟他的新伙伴 else 和 then

    Angular 扩展了ngIf 指令, 加入了两个新伙伴 else 和 then。

    mafeifan
  • 低成本学习IT技术

    比如我想学习react native。因为很多是从国外传进来的,国内还没有好的教程。 教你一个低成本学习的方法。几乎免费获得国外的电子书。当然是英语不要太差。...

    mafeifan
  • Jenkins2 学习系列16 -- 制品管理

    制品是软件开发过程中产生的多种有形副产品之一,个人理解,比如前端build后产生的dist静态资源文件,安卓打包生成的apk文件,这些产物都可以认为是制品。 ...

    mafeifan
  • SDN中”软件”如何定义”网络”

    SDN(Software Defined Network)软件定义网络,字面释义都说了是“软件”来定义“网络”,但有心之人会想:这个“软件”到底是如何定义了我们...

    SDNLAB
  • 自增主键,三类插入测验答案,在这里。

    《三类插入与自增键的关系》一文,基本解答了《自增键四道测验题》,仍有水友要求贴答案,原理都解释了,copy语句执行下,真的难么? 画外音:你们赢了,我还是贴一下...

    架构师之路
  • 当SDN 遇到物联网

    工业物联网(Industrial Internet of Things,简称 IIoT)预示着一股新的现代化浪潮,在许多行业,客户和内部利益相关者要求在生产力、...

    半吊子全栈工匠
  • 2-VIII--ViewPager滑动监听与自定义滑动特效

    张风捷特烈
  • 我们为什么需要SDN?

    众所周知,相比发展迅速的计算机产业,网络产业的创新十分缓慢。每一个创新都需要等待数年才能完成技术标准化。为了解决这个问题,SDN创始人Nick McKeown教...

    博文视点Broadview
  • android获得ImageView图片的等级

    android获得ImageView图片的等级问题 要实现的功能如下图,点击分享能显示选中与不选中状态,然后发送是根据状态来实现具体分享功能。 ? 在gridv...

    欢醉
  • 【业界观察】运营商迈进SDN时代

    SDN突破了传统运营商网络因协议标准化、设备专用化、能力封闭化而带来的制约,降低了对专用硬件设备的依赖性,可以降低运营商庞大的支出。也正因为如此,业界对SDN的...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券