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 根据用户组/组织/团队过滤查询结果的主要内容,如果未能解决你的问题,请参考以下文章

Drupal7 根据用户组织过滤可见的网络表单

cakephp:从下拉列表中为报告添加过滤器

CakePHP 3.x JWT 认证服务器

CakePHP 3.x - 仅在前缀中的扩展路由器

从 cakephp 3.x 迁移到 cakephp 4.x [关闭]

CakePHP 3.x 从实体获取相关数据