请问Laravel中的Policy单独使用和配合Gate Facade使用时的真值为何会相反?

  1. 运行环境
    i7-6700HQ 8GBRAM

1). 当前使用的 Laravel 版本?
Laravel 9.*
//: <> (使用 php artisan –version 命令查看)

2). 当前使用的 php/php-fpm 版本?
PHP 版本:
8.0.28
//: <> (使用 php –version 命令查看 php 版本)

php-fpm 版本:
master
//: <> (代码里 phpinfo 函数,然后页面访问查看 php-fpm 版本)
//: <> (如不方便使用 phpinfo 函数 ,使用 ps aux | grep php-fpm.conf 命令查)
//: <> ( 看 php-fpm 版本。如有多个,请以 nginx 站点配置为准。)

3). 当前系统
OpenEuler 22.03LTS
//: <> (期待数值 Windows 10 / Ubuntu 20.4 / CentOS 8)

4). 业务环境
开发环境
//: <> (期待信息 开发环境 或 生产环境)
//: <> (是否使用负载均衡?请提供相关信息)

5). 相关软件版本
nginx 1.21.5
//: <> (提供相关软件的版本,如 Nginx 、MySQL、MongoDB 等)

  1. 问题描述?
    这个是单独使用Policy的:
    请问Laravel中的Policy单独使用和配合Gate Facade使用时的真值为何会相反?

这个是Policy配合Gate Facade使用的:

请问Laravel中的Policy单独使用和配合Gate Facade使用时的真值为何会相反?

在单独使用Policy时,Policy返回TRUE,用户就会被授权。
当使用Gate Facade时,Gate::denies(…)时,真值为TRUE,Gate::allows(…)时,真值为FALSE。

  1. 您期望得到的结果?
    请问这些是什么问题?同一个Policy在不同用法之下真值为何会相反?如何解决?

  2. 您实际得到的结果?#

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

如果你需要判断某个用户,是否有权执行某个行为,你可以在 Gate 门面中,使用 forUser 方法:

if (Gate::forUser($user)->allows('update-post', $post)) {
    // 这个用户可以提交update...
}

if (Gate::forUser($user)->denies('update-post', $post)) {
    // 这个用户不可以提交update...
}
1年前 评论
LMZ-ZH (楼主) 1年前

无论是用 Auth::user()->can() 还是 Gate::allow() 其底层都是通过 Illuminate\Auth\Access\Gate::check() 方法实现的,区别在于,Auth::user() 是通过指定鉴权的用户,Gate::allow() 则是自动注入用户信息。

所以我觉得可能问题出在你两次测试的场景并不完全一致,你可以把前后两次路由的定义也附上(主要是看 Auth 中间件是否都起作用了),以及在使用 Gate::allow() 前先试试 Auth::user 能否正常获取用户信息!

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!