Here I come, there I am.

В CakePHP book има два урока за начинаещи - първият от които е за създаването на блог (нещо доста лесно дори за начинаещи), а второто - създаване на администрация с Auth и Acl компонентите - нещо изключително сложно дори и за не толкова начинаещи :)

На мен ми отне доста време да навлезна в нещата. Досега бях ползвал единствено Auth, а бях писал и мой собствен малък компонент за забрана на административния панел. Acl връзките обаче ми отнеха доста време. Прегледах няколко open source проекта, както и плъгини на мои колеги, но не намерих работещ пример за същото нещо. Получи се горе-долу като в CodeIgniter - има доста различни решения за Acl, тъй като стандартното не е особено удобно или е трудно за интеграция (по тази причина пуснах алфата на ZonesCI)

В края на краищата урокът от сайта на CakePHP е на Mark Story, който го е описал в две страници в блога си. След като опитах няколко пъти да го направя, а и поговорих лично с него и с други по-опитни хора от contributor-ите, успях да подкарам демото. Качен е примерен проект и лекцията е относително подробна, с няколко дребни изключения поради разликата между CakePHP 1.2 и 1.3.

Първата страница обикновено не е проблемна при следване на инструкциите. Там са основните неща - създаване на базата и промяна на контролерите и моделите, за да бъдат свързани с 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, ще имаме изцяло работеща система: ще можем да се логнем с предварително създадените ни потребители и те ще бъдат ограничени, както сме посочили. 

CakePHP Acl pluginПроблем обаче е задаването на привилегиите. Писането в шела е мъчно и дълго, а и най-вече неясно и съвсем неудобно за нетехнически хора. На помощ идва 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 и административен панел за привилегии. :)

Share and Enjoy:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • MySpace
  • Slashdot
  • Technorati
  • TwitThis
del.icio.us Digg DZone Facebook Google Google Reader Magnolia reddit SlashDot Technorati ReadMe.ru Dobavi.com Dao.bg Lubimi.com Ping.bg Pipe.bg Svejo.net Web-bg.com

Сходни постове:

  1. Колко от вас работят с CakePHP? Един интер
  2. ZonesCI - малка CodeIgniter auth библиотека   Вче
  3. CakePHP и RSS feed без магии   Cak
  4. CakePHP и свързани select-и с AJAX Наложи се

Related posts brought to you by Yet Another Related Posts Plugin.

Comments

3 Responses to “CakePHP - администрация, Auth, Acl и привилегии”

  1. Method-X on July 10th, 2010 21:14

    Мерси много. И аз доста време си бих главата с това, но не беше много успешно :)

  2. nofearinc on July 10th, 2010 21:30

    Пробвай насоките и кажи дали стават - на мен доста ми помогнаха, а acl_plugin е супер удобен за администрация.

  3. Стоимен on July 10th, 2010 22:02

    Мерси много, че си описал тези неща как да се нагласят. Точно те ме спънаха преди време, като се опитах да науча CakePHP.

Leave a Reply