3

要点很简单:我有一个 UserPolicy 方法来检查用户是否想要编辑他/她自己的个人资料。所以我这样做了:

public function update(User $user, User $model)
{
    return $user->id === $model->id;
}

这在 UserController 中被调用,如下所示:

public function edit(User $user)
{
    $this->authorize('update', $user);
    return view('users.edit')->with('user', $user);
}

PostController 和 PostPolicy 中的所有内容都是相同的,旨在检查用户是否可以编辑他/她自己的帖子并且它可以工作。唯一的区别在于他们的签名,因为一个有两个用户(第一个是 Laravel 注入的当前经过身份验证的用户,另一个是我要检查它的实例),另一个有上面看到的自动注入的经过身份验证的用户和一个帖子实例。无论如何,它抛出:

Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException

This action is unauthorized.

我试过了,dd($model)但我得到了同样的例外。为什么?提前致谢!

编辑

在我的 AuthServiceProvider 中也设置了:

    protected $policies = [
    // 'App\Model' => 'App\Policies\ModelPolicy',
    Post::class => PostPolicy::class,
    User::class => UserPolicy::class,
];

我的 routes.php 也是如此:

// Authentication Routes...
$this->post('login', 'Auth\LoginController@login')->name('login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
$this->post('register', 'Auth\RegisterController@register')->name('register');

// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');

Route::get('/', 'HomeController@index')->name('home');

Route::resource('posts', 'PostController');

Route::resource('users', 'UserController')->except('index', 'create', 'store');

上面的所有内容都在这里调用:

@if ($user->id == Auth::id())
    <a class="btn btn-link float-right p-0"
    href="{{ route('users.edit', Auth::id()) }}">

        <i class="fas fa-cog"></i>
        Edit profile
    </a>

    <br><br><br>
@endif
4

2 回答 2

7

我自己给出了一个答案:我尝试编写模型和策略的完整路径,而不是通过类的名称注册策略并且它有效(当然,我不知道为什么)。

我确实喜欢这样:

protected $policies = [
    // 'App\Model' => 'App\Policies\ModelPolicy',
    'App\User' => 'App\Policies\UserPolicy',
    'App\Post' => 'App\Policies\PostPolicy',
];

无论如何,感谢大家试图帮助我。希望有一天它会帮助别人!

于 2018-05-29T19:20:21.990 回答
-2

只需更改您的 UserPolicy 方法

public function update(User $user, User $model)
{
    return $user->id === $model->id;
}

为了

public function update(User $user, User $model)
{
    return $user->id == $model->id;
}
于 2021-07-02T13:50:25.517 回答