DataMapper ORM中的深层访问控制

DataMapper ORM中的深层访问控制,orm,codeigniter-2,codeigniter-datamapper,Orm,Codeigniter 2,Codeigniter Datamapper,导言 我目前正在DataMapperORM安装中构建一个访问控制系统(使用CodeIgniter 2.*)。我的用户权限(根/匿名层)的初始注入工作得很好。当用户登录DataMapper时,在系统中完成的调用将自动标记为用户拥有的用户权限 所以直到这一点,它工作得很完美,但现在我有点左右为难。问题是我需要某种方法来捕获和过滤实例化对象上的每个方法调用 我有两个特殊的电话,所以我也可以禁用用户权限检查。这在我想要登录用户并需要进行初始检查的时候特别方便 DataMapper::disable_us

导言

我目前正在DataMapperORM安装中构建一个访问控制系统(使用CodeIgniter 2.*)。我的用户权限(根/匿名层)的初始注入工作得很好。当用户登录DataMapper时,在系统中完成的调用将自动标记为用户拥有的用户权限

所以直到这一点,它工作得很完美,但现在我有点左右为难。问题是我需要某种方法来捕获和过滤实例化对象上的每个方法调用

我有两个特殊的电话,所以我也可以禁用用户权限检查。这在我想要登录用户并需要进行初始检查的时候特别方便

DataMapper::disable_userrights();

$this->_user = new User($this->session->userdata('_user_id'));
$this->_userrights = ($this->_user ? $this->_user->userrights(TRUE) : NULL);

DataMapper::enable_userrights();
以上内容确保我可以进行初始用户(及其用户权限)注入。在DataMapper库中,我使用
$CI=&get_instance()
访问我使用的
\ucode>全局文件。我正在构建的这一期中的一般规则是,
$this->
是为“globals”系统保留的,该系统总是被加载(有时可能为NULL/FALSE),因此我可以轻松访问几乎总是在每个页面/调用中需要的信息

详细信息

好的,上面的图片显示我登录的用户在
User
实体上拥有用户权限:
Create/Read/Update
。所以现在如果我把一个简单的

$test = new User();
$test->get_where('name', 'Allendar');
DataMapper实例中的
$\u权限
数组将知道当前登录的用户可以在“this”实例上执行某些任务

protected $_rights = array(
    'Create' => TRUE,
    'Read' => TRUE,
    'Update' => TRUE,
    'Delete' => FALSE,
);
问题

现在我的问题来了。我希望通过对执行的每个操作进行验证来控制这些用户权限。我有以下想法

  • 超冗余;创建一个全局验证方法,该方法在DataMapper类中每个方法的开头执行。
    • 问题1:我必须用相同的调用发送整个DataMapper类的垃圾邮件
    • 问题2:我无法控制DataMapper扩展方法
    • 问题3:如何检测关系包含?它们也应该得到验证
  • 某些核心DataMapper调用上的低级绑定,我可以清楚地检测到在数据库上执行了什么类型的操作(
    C/R/U/D
  • 所以我的目标是选择2(和
    1.)问题2
    ),因为它也将解决
    1.)问题2

    问题是DataMapper是如此庞大,在其最深的调用级别上识别实际发生的情况非常复杂。此外,看起来所有方法都非常分散,几乎从不互相使用(
    $this->get()
    通常不用于最终调用以获取数据集)

    所以我的目标是:

    • 用户(已登录、匿名、根用户)创建数据映射器istance
      • $user\u test=新用户
    • 用户希望获得
      $User test
      读取
      • $user\u test->get(1)
    • DataMapper将验证在数据库中完成的实际调用
      • 如果只是选择;嗯
      • 如果选择以外的内容(或连接到用户无权访问该/那些模型的其他模型,则将失败并显示一条清晰的错误消息)
      • 如果加入模型,也验证;嗯
    • 返回实际实例;
      • 如果确定:继续DataMapper的正常工作流程
      • 如果不确定:通知用户并返回该模型的正常空DataMapper实例
    此外,对于这个系统,我认为我需要为
    raw_sql
    (等)sql调用添加一些定制,以便我必须手动注入与该sql语句相关的权限,或者只允许
    Root
    用户执行这些操作

    重述

    我很好奇是否有人在DataMapper中尝试过类似的操作,或者有人提示我如何在DataMapper中使用/拦截这些最低级别的调用


    如果我能在DataMapper实际的最终查询调用的最深层次上获得一些许可,我自己可能也会有很长的路要走。

    我建议不要在DataMapper本身中这样做(主要是因为代码的复杂性,正如您已经注意到的那样)

    相反,使用一个基本模型,并扩展Datamapper。然后将代码添加到ACL检查所需的基本模型中,然后重载每个需要ACL检查的Datamapper方法。让它调用您的ACL,处理被拒绝的访问,如果允许访问,只需返回
    parent::method()的结果


    然后,应用程序模型应该扩展这个基础模型,而不是扩展Datamapper,这样它们将继承ACL特性。

    谢谢Harro。通过将所有逻辑存储在扩展DataMapper的单独DM_模型类中修复了此问题。我将其存储在datamapper库文件tho中。是否有更干净的方法将其连接到DataMapper?问题是,当我将其单独存储在Models文件夹中时,它会出现问题,而DataMapper希望调用相关表(name)。