Laravel 通过Gate实现用户-角色-权限控制

1.创建相应的数据库:

创建权限表:

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

创建角色表:

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

创建角色与权限的关系表:

Schema::create('role_permissions',function(Blueprint $table){
            $table->increments('id');
            $table->integer('role_id');
            $table->integer('permission_id');
            $table->timestamps();
        });

创建用户与角色的关系表:

Schema::create('admin_user_role',function(Blueprint $table){
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('rold_id');
            $table->timestamps();
        });

2.创建相应的模型,其中 用户与角色 角色与权限存在多对多的关系,创建相应的方法映射相应的关系

用户模型:

//用户的角色 ,如 系统管理员,商品管理员

    public function roles()
    {
       return $this->belongsToMany('App\Role','admin_user_role','user_id','role_id');
    }
    //判断某个用户是否拥有某种角色 intersect 将两个集合交集处理
    public function isInRoles($roles)
    {
        if ($this->roles->intersect($roles)->count() > 0){
            return true;
        }else{
            return false;
        }
    }
    //为用户赋予角色
    public function assignRole($role)
    {
        return $this->roles()->save($role);
    }
    //为用户取消角色
    public function deleteRole($role)
    {
        return $this->roles()->detach($role);
    }
    //判断用户是否有某种权限
    public function hasPermission($permission)
    {
        return $this->isInRoles($permission->roles);
    }

角色模型:

 //当前用户所拥有的权限
    public function permissions()
    {
        return $this->belongsToMany('App\Permission','role_permissions','role_id','permission_id');
    }
    //给角色赋予权限
    public function assignPermission($permission)
    {
        return $this->permissions()->save($permission);
    }
    //取消角色的权限
    public function deletePermission($permission)
    {
        return $this->permissions()->detach($permission);
    }
    //判断角色是否拥有权限
    public function hasPermission($permission)
    {
        return $this->permissions()->contains($permission);
    }

权限模型:

 //权限属于那些角色
    public function roles()
    {
        return $this->belongsToMany('App\Role','role_permissions','permission_id','role_id')->withPivot('permission_id','role_id');
    }

3.在AuthServiceProvider.php 中的boot方法中使用Gate来赋予当前用户权限:

$permissions = Permission::all();
        foreach ($permissions as $permission){
            Gate::define($permission->name,function ($user) use($permission){
               return $user->hasPermission($permission);
            });
        }

4.在前端界面中使用@can来控制相应的模块是否显示:

 @can('product')
            <li id="product-manager" class="treeview">
                <a href="#"> <span>商品管理</span>
                    <span class="pull-right-container">
                        <i class="fa fa-angle-right pull-right"></i>
                    </span>
                </a>
                <ul class="treeview-menu">
                    <li id="product_category"><a href="/product/category"><i class="fa fa-circle-o"></i>分类管理</a> </li>
                    <li id="product"><a href="/product/index"><i class="fa fa-circle-o"></i>商品管理</a> </li>
                    <li id="product_attribute"><a href="/product/attribute"><i class="fa fa-circle-o"></i>属性管理</a> </li>
                </ul>
            </li>
            @endcan

            @can('system')
            <li class="treeview"id="system-manager">
                <a href="#"> <span>系统管理</span>
                    <span class="pull-right-container">
                        <i class="fa fa-angle-right pull-right"></i>
                    </span>
                </a>
                <ul class="treeview-menu">
                    <li id="system_permission"><a href="/system/permission/index"><i class="fa fa-circle-o"></i>权限管理</a></li>
                    <li id="system_role"><a href="/system/role/index"><i class="fa fa-circle-o"></i>角色管理</a></li>
                    <li id="system_admin"><a href="/system/system_admin"><i class="fa fa-circle-o"></i>系统管理员管理</a></li>
                    <li id="system_info"><a href="/system/system_info"><i class="fa fa-circle-o"></i>系统信息</a></li>
                </ul>
            </li>
            @endcan

猜你喜欢

转载自blog.csdn.net/qq_20933903/article/details/83272422