cakephp ACL创建ARO,但左右值为空

时间:2014-06-17 17:40:31

标签: cakephp tree authorization acl cakephp-2.2

使用CakePHP 2.2.3 我差不多完成了我的项目,现在又回到设置授权。

我正在实现ACL,截断用户和组表以便重新启动,运行命令重新创建aco / aro / aros_acos表并遵循教程。

当我创建一个组时,它会创建一个相应的ARO条目,但是lft和rght字段为NULL。我在用户/组模型和控制器中注释掉了我的所有其他代码,试图将其缩小范围,但似乎没有帮助。

我将在下面发布我的代码,为了空间而删除了注释和验证。

小组模特:

App::uses('AppModel', 'Model');

class Group extends AppModel {
public $actsAs = array('Acl' => array('type' => 'requester'));

public function parentNode() {
    return null;
}

public $hasMany = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'group_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);
}

用户模型:

App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
//setup ACL settings and function
public $actsAs = array('Acl' => array('type' => 'requester'));

public function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    if (isset($this->data['User']['group_id'])) {
        $groupId = $this->data['User']['group_id'];
    } else {
        $groupId = $this->field('group_id');
    }
    if (!$groupId) {
        return null;
    } else {
        return array('Group' => array('id' => $groupId));
    }
} // end parentNode()

public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
    $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}

AppController的:

App::uses('Controller', 'Controller');
class AppController extends Controller {

public $components = array(
    //'Security',
            'Acl',
    'Auth' => array(
        'authorize' => array(
                        'Actions' => array('actionPath' => 'controllers')
                            )/*,
        'authenticate' => array(
            'Form' => array(
                'scope' => array('User.activated' => 1 )
                )
            ) */
        ),
    'Session'
 ); 
public $helpers = array(
    'Html',
    'Text',
    'Session',
    'Form'
); 

 /* public function isAuthorized($user = null) {
    return true;
 } */

public function beforeFilter(){

$this->Auth->loginRedirect = array('controller' => 'products', 'action' => 'index' );
    $this->Auth->logoutRedirect = array('controller' => 'products', 'action' => 'index');
    $this->Auth->authError = 'You are not allowed to see that.';
 }

我甚至在全新安装的cakephp 2.4.6上进行了ACL实现,一切都很好。我将这些项目并排进行比较,但在我的ACL设置中找不到差异

为什么我的ARO表中没有设置我的lft和rght字段?

1 个答案:

答案 0 :(得分:0)

简答:删除与ACL表关联的MVC文件。

简短答案: 我在全新安装的蛋糕2.2.3上设置了ACL,一切都很好。从我的用户和组模型和控制器以及AppController中覆盖了我的代码,但仍然没有。

当我忘记添加$ actsAs = array(' Tree')时,我已经看到了类似的情况;到一个模型。

我意识到我为所有ACL表烘焙了控制器/模型/视图。 DOH! (寻找aroscontroller,acoscontroller等)

我删除了这些表的所有MVC文件,现在效果很好。

这不是一个典型的问题,因为通常会在烘焙后添加ACL模式,但我开始使用我在另一个项目中使用的数据库而忘记删除表。

我真的希望我的愚蠢在这种情况下帮助别人。