【问题标题】:CakePHP 3.x Filter Query results based on User Group / Organisation / TeamCakePHP 3.x 根据用户组/组织/团队过滤查询结果
【发布时间】:2019-06-07 11:55:02
【问题描述】:
我需要确保我的大多数模型的查询返回基于用户与模型的关系(组成员、组织、成员、团队成员)的结果。
在我的应用中:
- 有 x 个组织
- 每个组织有 x 个成员
我希望用户创建的数据只有在同一组织内创建时才能访问。
例子:
- 列出与当前成员相关的所有任务(角色:用户、ManyToMany w/JoinTable)
- 列出与同一组织的用户相关的所有任务
- 编辑任务时,仅列出属于同一组织的用户
-
绝对防止任何深度关联返回与用户组织无关的结果
class OrganizedBehavior extends Behavior {
protected $_defaultConfig = [];
public function beforeFind(Event $event, Query $query, ArrayObject $options) {
$modelName = $event->getSubject()->getAlias();
if(isset($options['oid'])) {
$query->where([$modelName.'.oid' => $options['oid']]);
}
return $query;
}
}
这可以通过以下方式实现吗:
- 整体行为?
- 自定义中间件?
- 身份验证/授权类?
- 还有更好的吗?
【问题讨论】:
标签:
php
mysql
cakephp
orm
authorization
【解决方案1】:
这可以通过外部化您的授权和使用第三方框架来实现。事实上,有一种称为基于属性的访问控制 (abac) 的架构方法可以让您执行此操作。在 ABAC 中:
- 您定义策略,例如
A user with role='X' can do action='view' on object of type='Y' if user.organization==object.organization
- 您定义将在策略中使用的属性,例如角色、部门、地点、组织。
您可以使用一些标准和软件包来定义自己的策略,例如 XACML、ALFA 或 OPA (REGO)。
整体架构如下:
- Policy Enforcement Point (PEP):这是您的应用与授权服务集成的地方。集成可以是您的应用程序中调用 PDP 的 PHP 代码,也可以是中间件(如您所说)或 API 网关...
- 策略决策点 (PDP):这是针对传入授权请求评估策略的地方。 PDP 最终会返回一个决定(允许/拒绝)和可选的附加元数据,PEP 需要处理这些元数据。
- 策略信息点 (PIP):PDP 可以在此处获取缺失的信息(例如用户的风险评分或部门)以做出决策。
此解决方案并非特定于 PHP。您可以find here 提供一个特定于 PHP 的实现。或者考虑 AuthZForce(开源授权服务)或Axiomatics(商业)。两者都可以保护 PHP 应用程序以及其他语言。