Laravel Permissions和带门/罐的角色

时间:2017-09-07 18:49:12

标签: laravel

目前我在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。没有权限“删除帖子”。但是你可以看到门是真的。

https://imgur.com/a/gf923

感谢您的支持

1 个答案:

答案 0 :(得分:0)

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

tykus:

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

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

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

你可能需要返回一个计数或第一个 - 如果没有许可就会出现错误,例如。

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