Laravel lighthouse / graphQL - 将模型列表限制为用户在嵌套查询中调用时可以访问的模型

Laravel lighthouse / graphQL - limit list of models to the ones user can access when called in a nested query

我的系统有属于用户的案例。用户是部门的一部分。设置是用户可以访问属于与用户在同一部门的用户的所有个案。

问题是:如果我是 UserX 并且我是 DepartmentA 的一部分,还有 UserY 是同一部门的一部分,还有 DepartmentB,第三个 UserZ 只是 DepartmentB 的一部分。像这样的查询允许 UserX 通过 UserY 访问 UserZ 案例:

query {
  me {
    id
    name
    department {
        cases {
            id
            user {
                id
                name
                department {
                    cases {
                        ... ends up listing cases belonging to departments that the user should not have access to
                    }
                }
            }
        }
    }
  }
}

所以我的问题是,我如何控制用户只访问 return 他们有权访问的案例,无论在什么 "context" 中请求案例。我会怎么做在 RESTful API 中做的只是获取用户可以访问的允许 ID 列表,并对其进行过滤,但我不确定这是否是在 graphql 中处理的正确方法解决方案。

我真的希望我的问题有道理,感谢您阅读。

不幸的是,使用 lighthouse-php 无法做到这一点——这并不是图书馆的错,而是 GraphQL 不够灵活,无法满足你的要求——你真的应该坚持使用REST 来管理您的数据流。

使用@can指令进行字段授权,使用@guard指令进行身份验证:

type Department {
  cases: [Case] @hasMany @guard @can(ability: "readCase")
}

然后,使用标准 Laravel 门(例如 AuthServiceProvider.php)定义规则:

Gate::define('readCase', function (User $user, Case $case) {
  return $case->department->is($user->department);
});

PS: 还有其他方法可以达到你想要的效果。前任。自定义解析器,使用 @complexity 限制字段查询深度等。但我认为 @can 最适合您的用例。