CakePHP 3.x 根据用户组/组织/团队过滤查询结果
Posted
技术标签:
【中文标题】CakePHP 3.x 根据用户组/组织/团队过滤查询结果【英文标题】:CakePHP 3.x Filter Query results based on User Group / Organisation / Team 【发布时间】: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;
这可以通过以下方式实现吗:
-
整体行为?
自定义中间件?
身份验证/授权类?
还有更好的吗?
【问题讨论】:
【参考方案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 应用程序以及其他语言。
【讨论】:
以上是关于CakePHP 3.x 根据用户组/组织/团队过滤查询结果的主要内容,如果未能解决你的问题,请参考以下文章