【问题标题】:Laravel Gate::any() returns reverted valueLaravel Gate::any() 返回恢复的值
【发布时间】:2020-05-31 18:16:51
【问题描述】:

我正在像这样在我的代码中定义门

    Gate::define('fullAccess',function ($user){
        return $user->id == 1;
    });
    Gate::define('manager',function ($user){
        return $user->type == User::TYPE_MANAGER;
    });

然后在控制器中我正在检查用户是否有权访问

 public function __construct()
 {
     if(!Gate::any(['fullAccess','manager'])){
         abort(403);
     }
 }

但是有一个问题:

 if(!Gate::any(['fullAccess','manager'])){
     //returns true
 }
 if(Gate::any(['fullAccess','manager'])){
     //returns false
 }

我绝对确定我的 ID 等于 1,并且我认为如果当前用户至少有一个访问操作可用,any() 函数必须返回 true。我错过了什么吗?

我也尝试了none 函数,它的工作方式相同

 if(Gate::none(['fullAccess','manager'])){
    //returns true;
 }

【问题讨论】:

  • 只是一个偶然的想法,会不会是你检查得太早了?控制器的构造函数可以在门定义等之前执行。
  • @PavelLint 是的,你是对的。我将访问检查替换为callAction,现在它工作得很好。谢谢!
  • @PavelLint 你能把这个写成答案吗?

标签: php laravel laravel-5


【解决方案1】:

正如我在评论中所说,在构造函数中检查内容通常是不安全的,并且可能导致意外的执行顺序。 OP 问题的解决方案是将访问检查从构造函数移到某个控制器函数或其他地方。干杯:)

UPD 带有代码示例: 您覆盖 callAction 方法以在控制器中的每个操作之前检查访问

public function callAction($method, $parameters)
{
    if(Gate::none(['fullAccess','manager'])){
        abort(403);
    }
    return parent::callAction($method, $parameters); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多