php - 可通过 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);
}
解决方案
好的,事实证明你应该在提问之前阅读最新 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 可选,它对来宾用户为空,可以在策略中处理。
推荐阅读
- python - 如何在 Visual Studio 中使用 python 设置相对路径?
- javascript - react-table styled-components 从 express js 服务器作为静态应用程序加载时会丢失样式
- ios - 如何限制调用 BGProcessingTaskRequest 的次数?
- c# - C# 再玩一次数字游戏
- java - Picasso 正在加载 URL,但没有显示图片
- haskell - map sum [[]] 的结果不对?
- javascript - 单击两个或多个按钮时弹出 Javascript
- r - 在 lm() 上使用 anova() 进行交互的综合 anova 忽略了一个因素
- python-3.x - “无法在应该开箱即用的项目上创建 cudnn 句柄:CUDNN_STATUS_ALLOC_FAILED”
- c - C读取文本文件并将内容放入结构中