CakePHP - 限制编辑到您自己的“数据”

时间:2011-07-20 13:27:26

标签: authentication cakephp cakephp-1.3 access-control

目前我使用Auth Component供用户登录/注销 - ACL被定义为在用户组(来宾,用户,管理员)之间进行排序 - 具有明显的限制;管理员可以访问所有内容,用户只能访问用户控制器中的编辑,而访客只能看到显示/索引/视图等等。

现在为了防止用户编辑其他用户 - 我有一个名为isOwner()的函数,它基本上会检查您是否正在尝试编辑自己的配置文件;并检查是否是管理员试图编辑。如果用户是他们尝试编辑的内容的所有者,那么它允许它,否则它只是重定向闪存消息。

阅读了http://book.cakephp.org/view/1245/Defining-Permissions-Cake-s-Database-ACL - 我想知道是否可以在ACL中定义它?

有些事情:

$this->Acl->allow(array('model' => 'User', 'foreign_key' => $id), 'Users', 'edit', $id) 

虽然我没有深入挖掘,但我假设我必须为每个注册的新用户编写上述行的beforeSave()以允许编辑他的个人资料。

2 个答案:

答案 0 :(得分:2)

[我决定将其作为答案发布,因为它包含代码示例]

您可以创建一个组件(或函数)并在app_controller中使用beforeFilter()回调,这样您就不需要手动将函数添加到所有控制器。

此外,您可以为操作使用多个前缀(请参阅核心中的Routing.prefixes),这样可以更轻松地控制访问。类似的东西:

<强> [app_controller.php]

function beforeFilter() {
    if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin'){
         if(!isAdmin() || !isOwner())
             $this->cakeError('error404');
    }
}

<强> [users_controller.php中]

  function admin_edit($id = null){
        ... // edit as usual
    }

在LAMP堆栈中,您的瓶颈通常在数据库中

我的蛋糕问题是它的查询次数。有一次,我看到我的“联系”页面只进行了21次查询,以检索数据结构,以及此公共页面的权限。

证明使用ACL访问数据的唯一方法是权限是动态的,即“用户#29可以编辑用户#12,因为管理员在后台确定了”。但是,如果您有访问数据的静态规则(例如“用户只能编辑自己的信息,管理员可以编辑所有内容”),那么当您已经知道答案时,执行查询就没用了,因为这个规则不会及时改变。

所以这一切都取决于你的应用..最后,最后一个想法,如果你仍然计划进行更多的查询= P你可以set the authorize method of the Auth component。但是使用ACL组件,在我看来似乎是一个坏主意

干杯!

答案 1 :(得分:0)

好的,差不多4年了,但是对于那些喜欢我的人来说,偶然发现了一个针对CakePHP应用程序的Acl解决方案;简短的回答是肯定的,但是必须仔细计划。如果你真的需要这个级别的Auth,那么Cake的ACL实现并没有真正可行的替代方案,这种方法至少是合理的(没有批评......)。注意当前稳定版本是2.4:

从本质上讲,解决方案是使用isOwner()替换代码中的$dbAcl->check($user, $entity, $action);调用,该调用会对ACL数据库结构进行查找 - 请参阅http://api.cakephp.org/2.4/class-DbAcl.html

当然还有更多内容。 CakePHP不为您提供实体级别的此类身份验证的现成解决方案。它为您提供了一个可用于构建一个工具包的工具包:

  • 用于查询ACL数据库结构的DbAcl。
  • AclBehavior。要对其应用实体级别授权的对象类的模型应加载Acl行为。这会自动创建和删除对象级别的ACO / ARO,并处理其中的所有内容。见http://api.cakephp.org/2.4/class-AclBehavior.html
  • Controller :: isAuthorized()的控制器级授权。您可以在此处拨打dbAcl::check()。见http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization。如果您真的想要,也可以从自定义授权模块中执行此操作。
  • 仍然需要使用CRUD或Action Authorize组件来补充这一点。重要的是要意识到在默认的CakePHP烘焙控制器中有2个隐式动作/端点子类。那些作用于Controller本身(添加,索引)和那些作用于控制器所代表的对象类的实体(编辑,查看,删除)的那些。这类似于类与实例方法。所描述的授权类型仅适用于作用于实体的终点。你回过头来看Action / Crud auth。
  • 您显然需要用户模型..

请注意,关于ACL的Cake文档末尾有两个很好的教程 - http://book.cakephp.org/2.0/en/tutorials-and-examples。它们没有明确地涵盖这种类型的设置,但是如果理解所涵盖的概念加上dBAcl,您应该能够以自己的方式。