【问题标题】:Authorization methods only works for default guard in Laravel授权方法仅适用于 Laravel 中的默认守卫
【发布时间】:2019-12-23 19:03:30
【问题描述】:

我正在使用 Laravel 5.5,我正在尝试使用 Gate 外观来允许管理员访问用户等资源。首先,我在AuthServiceProvider.php 中定义了一个门,如下所示:

Gate::define('view-users', 'App\Policies\UserPolicy@view');

然后,我在 Policy 类中编写 view 方法,如下所示:

public function view(Admin $admin, User $user)
{
    return true;
}

并且,我应用如下授权:

//UsersController.php

$user = User::first();
if (Gate::allows('view-users', $user)) {
    $users = User::all();
    return view('admin.users.list', compact('users'));
}
return abort(403);

我注意到,$user 参数是无用的变量,我不需要它来执行授权。 顺便说一句,当我使用Gate门面的allows()方法时,它总是返回false。而当我改用 denies() 时,这些步骤可以正常工作。

allows() 方法有什么问题?!

但是,对应于 Laravel 文档,我测试了其他通过 middleware()Modelauthorize() 应用授权的方法。但是,我得到了相同的结果。

编辑: 我应该注意我正在使用名为 web_admin 的自定义守卫

感谢您的帮助。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    将您的策略​​方法更改为:

    public function view(User $user)
    {
        return $user->isAdmin;
    }
    

    策略方法的第一个参数始终是当前经过身份验证的用户。请注意,您不需要将当前经过身份验证的用户传递给这些方法。 Laravel 会自动将用户传递到门关闭:

    if (Gate::allows('view-users')) {
        // The current user can view all users...
    }
    

    如果您想检查当前用户是否可以更新特定用户,您的策略方法是:

    public function update(User $authenticatedUser, User $beeingEditedUser)
    {
        return $authenticatedUser->isAdmin;
    }
    

    然后像这样授权:

    if (Gate::allows('update-user', $beeingEditedUser)) {
        // The current user can update the user...
    }
    

    如果您使用自定义防护(根据 your comment),您可能有 2 个选项:

    1. 使用forUser方法:
    use Illuminate\Support\Facades\Auth;
    
    if (Gate::forUser(Auth::guard('web_admin')->user())->allows('view-users')) {
        // The current user can view all users...
    }
    
    1. 保护路由,指定守卫:
    Route::middleware('auth:web_admin')->group(function () {
        Route::get('/users', 'UserController@index');
    });
    

    这会导致 Larvel 设置您的默认身份验证驱动程序并根据您的自定义保护解析身份验证用户。

    【讨论】:

    • 感谢您的帮助。我应用了您的解决方案,但问题仍然存在。我将view 方法更改为public function view(Admin $admin){return $admin->isSuperAdmin();},以便isSuperAdmin() 返回$this->admin_name === 'particular_name' ?: false;。我应该注意到,管理员是在名为 web_admin 的不同守卫上检索到的,我在 Laravel 的auth.php 中声明了它。我会感谢您的下一个解决方案。
    • 我想要 if (Gate::allows('update-user')) {return abort(401);} 制作更简洁的代码示例 Gate::allows('update-user')->abort(401)Permission::can('update-user') 我应该在哪里制作?我的意思是什么文件和在哪里?
    猜你喜欢
    • 2018-01-18
    • 2018-03-30
    • 2020-08-07
    • 2019-07-05
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多