【问题标题】:Laravel Permissions and Roles with Gate/CanLaravel 权限和角色与 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 吗??

标签: laravel


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2014-09-15
    • 2017-09-13
    • 2019-04-27
    • 2019-07-31
    • 1970-01-01
    • 2022-01-01
    • 2021-02-02
    • 2016-05-22
    • 2020-11-01
    相关资源
    最近更新 更多