Jul
10
CakePHP - администрация, Auth, Acl и привилегии
at
19:32 by
nofearinc
Category: CakePHP
В CakePHP book има два урока за начинаещи - първият от които е за създаването на блог (нещо доста лесно дори за начинаещи), а второто - създаване на администрация с Auth и Acl компонентите - нещо изключително сложно дори и за не толкова начинаещи
На мен ми отне доста време да навлезна в нещата. Досега бях ползвал единствено Auth, а бях писал и мой собствен малък компонент за забрана на административния панел. Acl връзките обаче ми отнеха доста време. Прегледах няколко open source проекта, както и плъгини на мои колеги, но не намерих работещ пример за същото нещо. Получи се горе-долу като в CodeIgniter - има доста различни решения за Acl, тъй като стандартното не е особено удобно или е трудно за интеграция (по тази причина пуснах алфата на ZonesCI)
В края на краищата урокът от сайта на CakePHP е на Mark Story, който го е описал в две страници в блога си. След като опитах няколко пъти да го направя, а и поговорих лично с него и с други по-опитни хора от contributor-ите, успях да подкарам демото. Качен е примерен проект и лекцията е относително подробна, с няколко дребни изключения поради разликата между CakePHP 1.2 и 1.3.
- трябва да добавим Session в масива с компоненти в app_controller.php, тъй като от версия 1.3 не се добавя автоматично, а flash съобщенията използват сесията
- cake schema run create вече не изисква 'run' като аргумент, така че трябва да се махне
- cake acl grant вече има друг синтаксис
Първата страница обикновено не е проблемна при следване на инструкциите. Там са основните неща - създаване на базата и промяна на контролерите и моделите, за да бъдат свързани с ACO и ARO функционалностите. Тъй като ACO и ARO са неясни в началото, добър урок е Access Control Lists от сайта, обясняващ с примери access control обектите и различните роли за тях.
Във втората част има малко повече места, които могат да бъдат спънка. На първо място идва въпросът: какъв е този root controllers обект? Отговорът е следният: controllers е главната папка, в която се намират контролерите. Това е началната точка, от която започваме. По-нататък, със скрипт (а може и на ръка), могат да се извлекат всички контролери + всички действия (actions) в CakePHP проекта ни. По този начин рекурсивно може да извикаме скрипт, който да ни генерира този списък.
Може да извикаме командата 1 към 1 в шела на Cake, без да се притесняваме.
P.S. За row-based ACL може да ползваме плъгина на Ceeram - user plugin. Той ни дава по-добра връзка за Auth, който прави проверки за ACO обекти, създадени с AclBehavior обекта.
По-долу има един скрипт buildAcl. Той прави именно това, което ни трябва - да мине надолу по контролерите и да напълни acos таблицата с всички контролери и методи, които ни трябват. Имайки списък с всички пътища, можем да зададем привилегии за тях за всяка роля - група или потребител в група.
buildAcl се извиква по следния начин:
http://localhost/иметонапроекта/users/buildAcl (ако хостваме на локалния хост)
Функцията може да се вика всеки път, когато добавяме нови методи или контролери в папката, за да е актуален списъкът. Това може да се прави и на ръка от шела, но е доста повече механична работа.
Най-критичната част по мое мнение е следващата: Setting permissions. Там срещнах основните затруднения.
След като сме прочели статията за Access Control Lists, става ясно, че трябва да свържем ролите (потребителите и групите) с контролите (контролерите и действията). Тъй като самия add не е със същия синтаксис от шела, лесен начин за начало е да се добави initDB функцията по-долу и да се извика - http://localhost/сайтътни/users/initDB (ако хостваме на локалната машина). Това ще даде примерни привилегии за нашите групи от 1 до 3, както е описано по-долу.
Така все пак ще имаме почти работещо приложение. Ако добавим login.ctp в app/views/users и добавим 2-та реда в logout() action-а на users_controller, ще имаме изцяло работеща система: ще можем да се логнем с предварително създадените ни потребители и те ще бъдат ограничени, както сме посочили.
Проблем обаче е задаването на привилегиите. Писането в шела е мъчно и дълго, а и най-вече неясно и съвсем неудобно за нетехнически хора. На помощ идва acl_plugin - плъгин за ACL в CakePHP, който предоставя удобен ajax-базиран административен панел
Демо на панела ще откриете тук. Така с drag'n'drop (или click+click) може да си създавате привилегии.
Схемата е следната - теглим проекта по http или с git и го добавяме в app/plugins/acl на проекта. Въпреки че онлайн се подвизава като acl_plugin, трябва в папката plugins да се именова като acl! Допълнителни настройки не са необходими - влизаме като администратор и достъпваме:
http://localhost/иметонапроекта/admin/acl/acl
Note: За да имаме достъп до acl, най-лесният вариант е временно да добавим в app_controller -> beforeFilter action-а един:
$this->Auth->allow('*');
Това ще ни разреши достъп до всеки път, докато си сглобим привилегиите. След това може да премахнем реда и да не го достъпваме без права.
Така имаме работеща CakePHP система с Auth, ACL и административен панел за привилегии.
Сходни постове:
- Колко от вас работят с CakePHP? Един интер
- ZonesCI - малка CodeIgniter auth библиотека Вче
- CakePHP и RSS feed без магии Cak
- CakePHP и свързани select-и с AJAX Наложи се
Related posts brought to you by Yet Another Related Posts Plugin.


















Мерси много. И аз доста време си бих главата с това, но не беше много успешно
Пробвай насоките и кажи дали стават - на мен доста ми помогнаха, а acl_plugin е супер удобен за администрация.
Мерси много, че си описал тези неща как да се нагласят. Точно те ме спънаха преди време, като се опитах да науча CakePHP.