CakePHP 2.0: ACL не работает

#cakephp-2.0

#cakephp-2.0

Вопрос:

Я использовал ACL в CakePHP 1.3 без единой проблемы, после 2 недель горьких разочарований он все еще не работает в CakePHP 2.0.

Я точно следовал руководству по ACL Cake, но ничего не происходит. Все Aro введены правильно, то же самое для ACO и разрешений.

После всего этого я могу без проблем вводить все запрещенные действия.

Таким образом, мой AppController:

 public $components = array('Acl','Auth'=> array(
                            'authenticate' => array(
                                'Actions',
                                'Form' => array(
                                    'fields' => array('username' => 'email')
                                    ),
                            )
), 'Session', 'MathCaptcha', 'RequestHandler');
 

В моем beforeFilter:

     $this->Auth->actionPath = 'controllers';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'home');
    $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'profile');
    $this->Auth->allow('display');
 

У кого-нибудь есть идея, что пойдет не так. Спасибо!

Ответ №1:

В CakePHP 2.0 я сделал это так:

app/Controller/AppController.php

 class AppController extends Controller {

    public $components = array(
        // others components...
        'Session',
        'Acl',
        'Auth'=> array(
            // Setting AUTHORIZATION "What can you do?"
            'authorize' => array(
                'Actions' => array(
                    'actionPath' => 'controllers'
                 )
            ),

            // Setting AUTHENTICATION "Who are you?"
            'authenticate' => array(
                'Form' => array(
                    'fields' => array(
                        'username' => 'email', 'password' => 'password'
                    )
                )
            )
        )
    );

// other stuffs...
 

При таком подходе ACL сделает всю грязную работу. Нет необходимости проверять разрешения, как вы, вероятно, знаете.

Я полагаю, что вы в порядке с ARO и ACO, ничего страшного. На всякий случай: http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html#simple-acl-controlled-application

В CakeBook для 2.0 показан консольный плагин под названием AclExtras, который создает ваши ACOS. Ваши ARO будут создаваться по мере добавления / удаления пользователей и групп. Я использовал этот плагин для создания ARO в отношении моих уже заполненных таблиц: http://www.alaxos.ch/blaxos/pages/view/plugin_acl . Это работает с версии 1.3, но есть бета-версия для версии 2.0, которая работает нормально.

После этого необходимо настроить разрешения. Вручную (или с консоли), как описано в этих ссылках: http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html#setting-up-permissions. Или визуально с помощью плагина Alaxos.

Я надеюсь, что это поможет! Это сработало для меня. Я использую CakePHP 2.0.2

Комментарии:

1. Большое спасибо за ответ, Коларес, вместе с ответом Скотта мне удалось заставить его работать.

Ответ №2:

Компонент аутентификации немного изменился с CakePHP 1.3 на 2.0. Я столкнулся с аналогичными проблемами при переносе приложения с 1.3 на 2.0. Я обнаружил, что настройка параметра авторизации была там, где мне нужно было внести изменения:

В beforeFilter:

 $this->Auth->authorize = array(
    'Actions' => array(
        'userModel' => 'User',
        'actionPath' => 'users'
    )
);
 

UserModel был классом модели, используемым в таблице Aro. actionPath — это корневой уровень действий, которые Acl проверяет в таблице Aco.

Вы также можете запретить, а затем разрешить:

 $this->Auth->deny('*');
$this->Auth->allow('display');
 

Надеюсь, это поможет.