【问题标题】:CakePHP 3.x Filter Query results based on User Group / Organisation / TeamCakePHP 3.x 根据用户组/组织/团队过滤查询结果
【发布时间】:2019-06-07 11:55:02
【问题描述】:

我需要确保我的大多数模型的查询返回基于用户与模型的关系(组成员、组织、成员、团队成员)的结果。

在我的应用中:

  1. 有 x 个组织
  2. 每个组织有 x 个成员

我希望用户创建的数据只有在同一组织内创建时才能访问。

例子:

  1. 列出与当前成员相关的所有任务(角色:用户、ManyToMany w/JoinTable)
  2. 列出与同一组织的用户相关的所有任务
  3. 编辑任务时,仅列出属于同一组织的用户
  4. 绝对防止任何深度关联返回与用户组织无关的结果

    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. 整体行为?
  2. 自定义中间件?
  3. 身份验证/授权类?
  4. 还有更好的吗?

【问题讨论】:

    标签: php mysql cakephp orm authorization


    【解决方案1】:

    这可以通过外部化您的授权和使用第三方框架来实现。事实上,有一种称为基于属性的访问控制 () 的架构方法可以让您执行此操作。在 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 应用程序以及其他语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      相关资源
      最近更新 更多