Laravel 权限和角色与 Gate/Can

Posted

技术标签:

【中文标题】Laravel 权限和角色与 Gate/Can【英文标题】:Laravel Permissions and Roles with Gate/Can 【发布时间】:2017-09-07 18:49:12 【问题描述】:

目前我在 codecourse.com 上做了一个名为“laravel 中的角色和权限”的教程。

在教程的第 4 部分中,我遇到了每次结果为真时都会遇到的问题。 如果我请求“编辑帖子”的许可,它应该显示为真,如果我请求“删除帖子”的许可,它应该显示为假。

我查了数据库关系,但是用户和“删除帖子”权限没有关系。

只有当我请求一个不存在的权限时,比如“blabla”(我的意思是数据库中不存在),我才会得到错误。

我相信他只是在检查是否有使用此名称的权限,而不是检查用户是否具有权限。

web.php

Route::get('/', function (\illuminate\Http\Request $request) 
$user = $request->user();

dump($user->can("delete posts")););

HasPermissionTrait.php

trait HasPermissionsTrait 

public function hasRole(...$roles)

    foreach ($roles as $role) 
        if ($this->roles->contains('name', $role)) 
            return true;
        
    

    return false;


public function hasPermissionTo($permission) 
    //Check has permission through role

    return $this->hasPermission($permission);


protected function hasPermission($permission) 
    return (bool) $this->permissions->where('name', $permission->name);


public function roles() 
    return $this->belongsToMany(Role::class, 'users_roles');



public function permissions() 
    return $this->belongsToMany(Permission::class, 'users_permissions');


PermissionsServiceProvider.php

public function boot()

    Permission::get()->map(function ($permission) 
        Gate::define($permission->name, function ($user) use ($permission) 
            return $user->hasPermissionTo($permission);
        );
    );


/**
 * Register the application services.
 *
 * @return void
 */
public function register()

    //

你可以在这里观看我的完整代码 -> https://github.com/RahmanG/joko

在这张图片上,您可以看到 Auth。没有“删除帖子”的权限。但你可以看到 Gate 是真的。

https://imgur.com/a/gf923

感谢您的支持

【问题讨论】:

需要注册那个 PermissionServiceProvder 吗?? 【参考方案1】:

我已经得到了答案。感谢来自 laracasts.com 的 tykus

泰库斯:

看起来你的特质可能有错误:

protected function hasPermission($permission) 
    return (boolean) $this->permissions->where('name', $permission->name);

$this->permissions->where('name', $permission->name) 返回一个 Builder 实例,并且转换为布尔值的对象始终为 true。

您可能需要返回一个计数或第一个 - 如果没有权限,这将是错误的,例如

protected function hasPermission($permission) 
    return (boolean) $this->permissions->where('name', $permission->name)->count();

【讨论】:

以上是关于Laravel 权限和角色与 Gate/Can的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 角色和权限操作

Laravel 角色和权限包

Laravel 和 MongoDB 以及高级角色/权限系统

如何在 laravel spatie 中分配多个角色和基于多个角色的权限?

laravel-如何在 5.1 中使用 zizaco 获得具有所有角色和所有权限的用户?

Laravel 5.3 Eloquent 关系 - 用户、角色、页面和权限