【问题标题】:Laravel policies: no usages in project, only 403Laravel 政策:项目中没有使用,只有 403
【发布时间】:2019-10-28 15:17:10
【问题描述】:

我正在尝试使用 laravel 策略来检查故事是否“可见”,如果不是,则经过身份验证的用户是否拥有该故事(在这种情况下,他仍然可以查看它)。我使用

设置我的策略
php artisan make:policy StoryPolicy --model=Story

在那里我设置了查看经过身份验证的用户是否可以看到故事所需的检查

<?php

namespace App\Policies;

use App\User;
use App\Story;
use Illuminate\Auth\Access\HandlesAuthorization;

class StoryPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view the story.
     *
     * @param  \App\User  $user
     * @param  \App\Story  $story
     * @return mixed
     */
    public function view(User $user, Story $story)
    {
        if ($story->visibility == 'visible') {
            return true;
        } else {
            return $story->user_id == $user->id;
        }
    }
}

我在我的 AuthServiceProvider 中注册了策略

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Story' => 'App\Policies\StoryPolicy'
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
    }
}

据我了解,我应该能够在我的控制器中使用此策略。我就是这么做的。

<?php

namespace App\Http\Controllers;

use App\Storyblock;
use App\User;
use Illuminate\Http\Request;
use App\Category;
use App\Story;

class StoryController extends Controller
{

    public function __construct(){
        $this->middleware('auth')->except('show');
    }

    //  GET shows the story page
    public function show(Story $story) {
        $this->authorize('view',$story);

        return view('story.show', compact('story'));
    }

}

然而这总是导致 403

我已经尝试了很多事情,改变了政策的设置方式,如果一切都正确的话,也会改变逻辑。经过 4 小时的在线查找后,我未能找到答案。

另外,在我的 phpStorm 中,我注意到我的策略文件显示为红色,并且在整个项目中都没有使用。这让我觉得我无法在我的 AuthServiceProvider 中导入它们

【问题讨论】:

  • 此时您可以忽略 IDE 所说的内容,如果没有运行时信息,它无法知道很多内容,尤其是考虑到对 Policy 类的唯一引用是通过字符串

标签: php laravel laravel-5.7


【解决方案1】:

我没有看到您的所有代码,但是当您想要访问 lavarel 资源并且您没有 scrf 令牌时,您会收到此消息,请确保您的所有视图或应用程序视图标题上都有此消息

<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">

我认为您只是尝试在没有此资源的情况下获取资源,然后它只会告诉您无权访问此资源。

【讨论】:

  • 把它放在视图扩展的我的布局/主控中,所以不是这样
【解决方案2】:

您已指定show 方法不会分配auth 中间件,因此可能没有经过身份验证的用户。来自政策文档:

“默认情况下,如果传入的 HTTP 请求不是由经过身份验证的用户发起的,所有的门和策略都会自动返回 false”

您需要继续阅读政策文档,了解如何处理缺少经过身份验证的用户 guest。

Laravel 5.7 Docs - Authorization - Writing Policies - Guest Users

【讨论】:

  • 我总是使用经过身份验证的用户对其进行测试,但我会调查一下,谢谢!
猜你喜欢
  • 2021-12-24
  • 2015-02-20
  • 2021-04-05
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2021-06-05
相关资源
最近更新 更多