Создать аро/ако, используя аро и ако

Я пытаюсь внедрить функциональность PDF в свое приложение. Итак, я добавил несколько новых действий в контроллеры (например, «viewpdf»). После этого я перестраиваю дерево ACL с помощью действия build_acl (из учебника Mark Story Автоматизированный инструмент для создания ACOS ). Итак, с помощью MySQL я вижу, что создается новый узел. До этого все нормально. Но теперь я пытаюсь проверить кнопку просмотра PDF и получаю сообщение «У вас нет прав для доступа к этому местоположению». ошибка (даже будучи администратором). Я проверяю файл error.log и вижу предупреждение:

> Aco: controllers/Specializations/viewpdf in [/usr/share/php/cake/libs/controller/components/acl.php, line 273]
2011-02-24 11:40:34 Warning: Warning (512): DbAcl::check() - Failed ARO/ACO node lookup in permissions check.  Node references:
Aro: Array
(
    [User] => Array
        (
            [id] => 1
            [email] => [email protected]
            [group_id] => 1
        )

)

Aco: controllers/Specializations/viewpdf in [/usr/share/php/cake/libs/controller/components/acl.php, line 273]

Затем я проверяю таблицу aros_acos в базе данных и вижу, что нет ACO «viewpdf», связанного с каким-либо узлом, поэтому есть ARO, ACO, но не ARO_ACO, поэтому я полагаю, что это причина, почему я получаю эта ошибка.

¿Верны ли мои предположения? Если да, то как мне создать этот aro_aco? Я боюсь, что могу что-нибудь сломать, если буду делать это вручную...

Заранее спасибо,

Альф.


person alfizqu    schedule 24.02.2011    source источник


Ответы (2)


альфизку,

если у вас есть ARO и ACO, но нет связи между ними с помощью записей в таблице ACO_ARO, это означает, что вы не установили разрешения, которые ваши ARO имеют для ACO.

Действуйте следующим образом:

/*
 * Copied from the tutorial, and modified, this function initializes the per-
 * missions for accessing controller actions.
 */
  function initDB() {
    $group =& $this->User->Group;

    // A D M I N S
    $group->id = 3;     
    $this->Acl->allow($group, 'controllers');

    // M A N A G E R S
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Items','*'); ... ...

После того, как вы настроили такую ​​функцию initDB, вы должны запустить ее один раз, вызвав ее из своего браузера. Если этого недостаточно, чтобы помочь вам вернуться на правильный путь, просто повторите базовое руководство по AUTH/ACL. Ваш, Бенджамин.

Правка 1: один из важнейших моментов — вызвать parent::beforeFilter() в beforeFilter() методах самоопределяемых контроллеров и правильно настроить app_controller. Если эти советы не помогают, самый эффективный способ — это очень внимательно изучить руководство по ACL/AUTH, начиная со свежей среды пирога. Как только вы сможете запустить его там, вы будете уверены, что сделаете это в своем приложении.

Редактировать 2: И не бойтесь выбросить все ACL/AUTH, связанные с вашим приложением. Это только звучит устрашающе, но это может сэкономить много головной боли/времени отладки.

P.S.: Кстати, в пекарне должно быть несколько умеренно используемых плагинов ACL/AUTH и один на sourceforge.

person benjamin    schedule 25.02.2011
comment
Подумав об этом, я думаю, что проблема не в aros_acos, потому что тогда вы были бы правы, а дело в том, что я запускаю initDB() каждый раз после build_acl. Итак, проверив еще раз таблицу aros_acos, я думаю, что все в порядке. Теперь я довольно потерян, есть другие идеи? Спасибо, кстати! - person alfizqu; 25.02.2011
comment
поскольку кажется, что вы делаете это как-то правильно, вы можете следить за моими правками 1 и 2. Перед этим я бы дважды проверил, не является ли это просто проблемой имени файла (view_pdf? viewpdf). Это может быть указано, если вы недавно создали это действие и можете правильно получить доступ к другим действиям. Ваш - - person benjamin; 26.02.2011
comment
Да, я идиот. Моим действием в контроллере было viewPdf (заглавная буква...). Мне очень жаль, что я отнял у вас время, я хотел бы проголосовать за вас, но у меня недостаточно репутации. :(. Спасибо большое за помощь. - person alfizqu; 26.02.2011
comment
Альфизк, я рад, что мы сделали это! - person benjamin; 27.02.2011

Попробуйте создать пример действия в пользовательском контроллере, как это

function install(){
     $aco = new Aco();
     $aco->create();
     $aco->save(array(
         'parent_id' => <Id of the Specializations in acos table>,
     'alias' => 'viewpdf',
     ));


    $this->Acl->allow('admin','controllers/Specializations/viewpdf','*');
}

Если вы запустите действие, в таблице acos будет создан новый узел Aco. а для пользователя-администратора вы можете дать полное разрешение. Вместо администратора вы можете использовать любого действительного пользователя (имя пользователя должно быть в таблице Aros).

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

person RSK    schedule 24.02.2011
comment
Как я уже сказал в другом комментарии, я думаю, что наконец-то таблица aros_acos хорошо настроена, так что теперь я не знаю, в чем проблема! Спасибо за ваш ответ! - person alfizqu; 25.02.2011