CakePhp和用户权限

时间:2011-07-19 10:25:21

标签: cakephp acl authentication

我需要一个允许用户修改与其相关的数据的系统。

像购物中心一样,有几家商店和一个共享目录。 我希望商店能够在全局池中编辑和添加项目。但我想限制商店对自己商品的访问权限。

如何使用acl& amp; auth(当然是概念)?

1 个答案:

答案 0 :(得分:1)

我已经看过几次这个问题了。从蛋糕的文档中可以看出:

  

访问控制列表或ACL处理两件主要事情:需要的东西   东西,以及想要的东西。

理论上,您可以使用ACL处理应用程序中的所有项目,但我发现有一些问题:

  • 假设您的商品表中每个商店有10k个元素,那么,您在ACO表中的元素数量相同。现在,如果你添加一个用户,你将不得不让他访问ARO_ACO表中的项目(每个用户另外10k项目!)
  • ..好吧也许我夸大了第一个例子。因为您可以对项目和ACO表进行分组,并且只在ACO_ARO表中设置每个组的权限。但是现在在您的应用程序中进行查询可能是一场噩梦,想象一下您是否想要制作过滤的分页项目列表。您必须要求ACO(现在采用树形结构)和ARO_ACO表来计算和分页项目......即使它自动完成,您也会遇到性能问题

在我看来,最好使用ACL仅授予控制器方法(CRUD)权限,并通过在查询中设置条件来管理代码中的项目权限:

$this->Items->find('all',array('conditions'=>array('store_id'=>$this->Auth->user('store_id'))))

但是您可能需要在任何地方重复此条件,以便您可以创建一个行为来修改查询以便在WHERE子句中添加条件,因此您将始终返回/编辑当前商店的项目。例如,创建一个这样的行为:

    /** 
     * Filter query conditions with the correct `type' field condition. 
     */ 
    function beforeFind(&$model, $query) 
    {
        /**
         * Condition for the paginators that uses joins
        */
        if(isset($query['joins']) && !empty($query['joins'])){
            foreach($query['joins'] as $key => $joinTable){
                if(ClassRegistry::init($joinTable['alias'])->hasField('store_id')){
                    $query['joins'][$key]['conditions'][] = $joinTable['alias'].".store_id = '".$_SESSION['store_id']."'";
                }
            }
        }

        /**
         * condition for the normal find queries
        */
        if($model->hasField('store_id') && $model->name != "User"){
            $query['conditions'][$model->name.'.store_id'] = $_SESSION['store_id'];
        }
        return $query;
    }

在控制器中我只需要正常调用find方法

$this->Items->find('all');

这样,您无需进行更多查询即可查看用户是否可以访问项目。我在网站上使用过这样的东西,对我来说效果很好。