在 Laravel Post 中授权资源控制器不起作用?

2023-12-08

我创建了一个 ProductPolicy,其中有:

<?php

namespace App\Policies;

use App\Models\Product;
use App\Models\Vendor;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ProductPolicy
{
    use HandlesAuthorization;

public function before($user, $ability){
    if($user->roles == 'admin' || $user->roles == 'editor'){
        return true;
    }
}

public function viewAny(User $user)
{
    return true;
}

public function view(User $user, Product $product)
{
    $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first();
    return $vendor_id === $product->vendor_id;
}

public function create(User $user)
{
    return true;
}

public function update(User $user, Product $product)
{
    $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first(); 
    return $vendor_id === $product->vendor_id;
}

public function delete(User $user, Product $product)
{
    $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first();
    return $vendor_id === $product->vendor_id;
}

public function restore(User $user, Product $product)
{
    //
}

public function forceDelete(User $user, Product $product)
{
    //
}
}

我允许用户编辑、更新、删除该产品(如果他们拥有该产品)。根据laravel文档,如果我们使用了资源控制器,我们可以使用authorizeResource方法。这就是为什么我添加了这个:

$this->authorizeResource(Product::class, 'products');

in the ProductController

但是当我尝试删除、编辑特定供应商拥有的产品时,它说,403授权。更重要的是我正在使用view

@foreach($allProducts as $productLists) 
@can('view', $productLists)
      codes....
   @endcan
@endforeach

但是,如果我这样做

public function viewAny(User $user)
{
    return false;
}

代替

public function viewAny(User $user)
{
    return true;
}

即使是管理员和编辑也无法添加、编辑、更新和查看产品。走到这里有什么问题吗?

Edit In my web.php我使用了如下资源路由:

Route::resource('products','ProductController');

我认为外来字段类型的问题就像字符串,而不是整数,并且您使用 === 运算符而不是 ==。

所以有两种可能的解决方案。

使用 == 而不是 == 运算符

或者在比较之前将字符串转换为整数

返回 $vendor_id === (int)$product->vendor_id;

和authorizeResource方法接受模型的类名作为其第一个参数,但您使用了错误的名称(产品),它应该是“产品”。 我认为应该是(从产品中删除 s)

$this->authorizeResource(Product::class, '产品');

<?php

namespace App\Policies;

use App\Models\Product;
use App\Models\Vendor;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ProductPolicy
{
    use HandlesAuthorization;

    public function before($user, $ability){
        if($user->roles == 'admin' || $user->roles == 'editor'){
            return true;
        }
    }

    public function viewAny(User $user)
    {
        return true;
    }

    public function view(User $user, Product $product)
    {
        $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first();
        return $vendor_id == $product->vendor_id; // issue here
    }

    public function create(User $user)
    {
        return true;
    }

    public function update(User $user, Product $product)
    {
        $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first(); 
        return $vendor_id === (int)$product->vendor_id; // issue here
    }

    public function delete(User $user, Product $product)
    {
        $vendor_id = Vendor::where('user_id', $user->id)->pluck('id')->first();
        return $vendor_id === (int)$product->vendor_id; // issue here
    }

    public function restore(User $user, Product $product)
    {
        //
    }

    public function forceDelete(User $user, Product $product)
    {
        //
    }
}

您可以在任何策略函数(您比较事物的地方)中运行以下语句,然后您就会明白了。

echo gettype($vendor_id).", ".gettype($product->vendor_id);
die;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Laravel Post 中授权资源控制器不起作用? 的相关文章

随机推荐

  • 为什么“隔空敲击”手势在我的 Unity/MRTK 应用程序中的 HoloLens1 上不起作用?

    我有一个 Unity 应用程序 我想将其与 Microsoft 混合现实工具包 MRTK 集成 当我将 MRTK v2 1 或 v2 2 包添加到 Unity 项目时 我可以在 Unity 编辑器中模拟 隔空敲击 手势 并且应用程序会注册该
  • 新信号连接到旧插槽而不是单独的插槽

    我正在尝试标记数据跟踪的 x 跨度 并使用 tagNames 起始 x 值和结束 x 值填充表 我正在使用 突出显示 对象的字典来跟踪 x 跨度 以防以后需要对其进行编辑 增加或减少 字典将 x 起始值映射到突出显示对象 因为 x 起始值应
  • 从 Bigquery 中的时间戳提取日期:一种更好的方法

    向 Bigquery 专家提出一个简短的问题 以下是使用标准 SQL 从 Bigquery 中的时间戳中提取日期的两种方法 standardSQL 1 DATE TIMESTAMP MILLIS CAST timestamp AS INT6
  • 当我需要引用自身时如何设计结构[重复]

    这个问题在这里已经有答案了 My 上一个问题告诉我 Rust 不能在结构中引用自身 所以我的问题是 当我需要引用自身时如何设计一个结构体 我们可以以这个结构体为例 struct SplitByChars lt a gt seperator
  • 当用户按下设备音量键时,搜索栏拇指位置发生变化

    我使用搜索栏来控制设备的音量 我只需在触摸板上拖动搜索栏的拇指即可更改设备的音量 但是当用户按下音量 侧面 键时 我需要相应地设置搜索栏拇指位置 我该怎么做 请告诉我 Thanks 我通过重写 onkeydown 事件得到了解决方案 Ove
  • Pygame set_alpha 不适用于尝试的背景淡入淡出

    我一直在尝试创建一个简短的代码 用于可以淡入和从黑色淡出的项目 但由于某种原因 只有淡入功能在工作 而淡出功能或多或少被跳过 通过给他们参数 我确认问题出在第二个函数中 并且透明度根本没有改变 这是我的代码 import pygame sc
  • 未找到带点(IP 地址)的路由,返回 404

    I use Lumen 5 4 这就是我的路线设置方式 app gt get ip ip GeoIpController class show The ip 路由参数应该是一个IP地址 其中带点 然而 当路线中有点时 似乎就会出现问题 它返
  • CharBuffer 位于内存映射的 ByteBuffer 之上,无需使用大量堆空间

    我正在编写一个java代码来在一个大的txt文件 6 8Gb 中搜索电子邮件地址和密码 我已经编写了代码 它可以处理 200Mb txt 文件并给出输出 但是当我输入 500Mb 文件时 它显示以下错误 Exception in threa
  • TensorFlow:“ValueError:没有为任何变量提供梯度”

    我正在张量流中实现 DeepMind 的 DQN 算法 并在我调用的线路上遇到此错误optimizer minimize self loss ValueError No gradients provided for any variable
  • PHP 表单 - 提交时停留在同一页面

    我有一个位于文件中的 PHP 表单contact html 该表格是从文件处理的processForm php 当用户填写表单并单击提交时 processForm php发送电子邮件并引导用户至 processForm php该页面上有一条
  • 将多个 IIS7 重写规则(重定向)合并为一个

    我使用iis7的URL重写模块来完成几件事 301重定向规则从非www到www 301 将规则 info 重定向到 com 已移至我的域的 com 版本 301 从旧页面重定向规则 例如 page name asp 改为 page name
  • Android Facebook 风格幻灯片

    新的 Facebook 应用程序及其导航非常酷 我只是想看看如何在我的应用程序中模拟它 任何人都知道如何实现它 单击左上角按钮后 页面会滑动并显示以下屏幕 Youtube 视频 我自己尝试过这个 我能找到的最好方法是使用 FrameLayo
  • 如何在 ruby​​mine 中停止/终止服务器(开发)

    这里是新手 我在 ruby mine 中创建了一个 Rails 项目来运行公共文件夹中的默认 index html 我按下了 shift F10 键 这与终端的 Rails 服务器相同 这就是我得到的 home bubble rvm rub
  • Java:转义 XML 文本内容而不是整个文本

    我想发送下面的 XML 请求 文本内容应该被转义 但标签不应该被转义 我试过了使用下面的转义逻辑 String str escapeXml11 req 然而 我的整个请求都被逃脱了 因此 它不再是有效的 XML 我原来的字符串 String
  • 在 Flexbox 中组合行和列

    我有三个元素article 照片 类别 然后是帖子信息 我试图弄清楚如何让类别元素堆叠在帖子信息列的顶部 2 在 3 的顶部 如果您正在查看所附照片 因此它看起来像两个 50 的列 即使有是三个弹性元素 flexbox display fl
  • 如何更改 gWidgets RGtk2 中鼠标光标的形状?

    在gWidgets中的ggraphics绘图区域中 将鼠标光标更改为 GDK TCROSS 但我想要与gwindow GDK LEFT PTR 相同的鼠标光标 library gWidgets library gWidgetsRGtk2 l
  • 球拍中的树形折叠

    我是 Racket 的初学者 我有这样的问题 定义一个结构 node 其中包含以下字段 value left middle right 该结构表示树结构中的节点 这些字段包含存储在节点 左子树中的值 分别为中子树和右子树 如果一个子树 不存
  • EntityFramework Core 自动迁移

    有没有代码可以实现自动迁移Entity Framework core code first在 asp net core 项目中 我只是在 MVC4 5 中添加 Database SetInitializer new MigrateDatab
  • Python 向量化嵌套 for 循环

    我希望能够帮助您找到和理解一种 Pythonic 方法来优化嵌套 for 循环中的以下数组操作 def func a b radius Return 0 if a gt b otherwise return 1 if distance eu
  • 在 Laravel Post 中授权资源控制器不起作用?

    我创建了一个 ProductPolicy 其中有