可通过Laravel政策进行公共访问

时间:2018-08-14 16:42:34

标签: php laravel authentication policy

我想公开Analysis的某些条目。我尝试通过策略实施它,但失败了。我认为这是因为每次我尝试未经授权用户访问时,AuthServiceProvider都会失败,并且AccessDeniedHttpException失败。

AuthServiceProvider

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;
}

AnalysisController

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

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

    ...
}

我试图只创建一个新的服务提供者,但这也没有用,因为如果不从AuthServiceProvider进行扩展,我将无法调用registerPolicies函数。

基本上,我想要做的只是检查demo属性是否为true。

编辑:

我的快速修复表单现在只是在检查控制器是否为演示。但这在我看来并不是一个很好的解决方案,因为我认为Policy的目标应该是我在Controller中没有访问管理。因此,我很想找到一个更好的解决方案。

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

1 个答案:

答案 0 :(得分:1)

好吧,事实证明,在提出问题之前,您应该始终阅读最新的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可选,对于来宾用户,它为null,可以在策略中进行处理。