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
最适合您的用例。
我的系统有属于用户的案例。用户是部门的一部分。设置是用户可以访问属于与用户在同一部门的用户的所有个案。
问题是:如果我是 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
最适合您的用例。