身份验证 – CakePHP – 将编辑限制为您自己的“数据”

目前我使用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()以允许编辑他的个人资料.

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

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

此外,您可以为操作使用多个前缀(请参阅核心中的Routing.prefix),这样可以更轻松地控制访问.就像是:

[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组件这样,在我看来似乎是一个坏主意

干杯!

点赞