首页 > 解决方案 > 可通过 Laravel 政策公开访问

问题描述

我想Analysis公开一些条目。我试图用策略来实现它,但失败了。我认为这是因为每次我尝试在没有授权用户的情况下访问时都会AuthServiceProvider失败。AccessDeniedHttpException

身份验证服务提供者

class AuthServiceProvider extends ServiceProvider
{
  protected $policies = [
    Analysis::class => AnalysisPolicy::class
  ];

  public function boot()
  {
    $this->registerPolicies();
  }
}

分析策略

public function view(User $user, Analysis $analysis)
{
    if($analysis->demo === true){
        return true;
    }
    return $user->id === $analysis->user_id;
}

分析控制器

public function show(int $analysis)
{
    $ana = Analysis::find($analysis);

    $this->authorize('view', $ana);

    ...
}

我试图创建一个新的服务提供者,但这也不起作用,因为如果不从 AuthServiceProvider 扩展,我就无法调用 registerPolicies 函数。

基本上,我现在想要的只是检查demo属性是否为真。

编辑:

我的 Quick-Fix 表单现在只是签入控制器(如果它是演示版)。但这在我看来不是一个很好的解决方案,因为我认为策略的目标应该是我在控制器中没有访问管理。所以我很想找到一个更好的解决方案。

if(!$ana->demo){
    $this->authorize('view', $ana);
}

标签: phplaravelauthenticationpolicy

解决方案


好的,事实证明你应该在提问之前阅读最新 Laravel 版本的发行说明。

从 Laravel 5.7 开始,有一个合适的解决方案:

public function update(?User $user, Post $post)
{
    return $user->id === $post->user_id;
}

https://laravel.com/docs/5.7/authorization#writing-policies
通过声明 $user 可选,它对来宾用户为空,可以在策略中处理。


推荐阅读