Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

ACL
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 06 Ноя 2007 14:24:51    Заголовок сообщения: ACL Ответить с цитатой

здрасте!
Народ, кто-нибудь использовал ACL в своих разработках? Я в первые рассматриваю ACL такого вида для организации прав доступов. До этого всегда использовал свои разработки.

Не могу разобраться вот в чем:
Например есть роли (пользователи, из таблицы users):
    id | foreign_key | alias
    1 | 1 | null
    2 | 2 | null
    3 | 3 | null

(alias не юзаю, т.к. кроме юзеров, других ролей не предвидится, поэтому строго цепляю на foreign_key - id юзверя).

А вот как дальше быть!?
Есть у меня, грубо говоря, две таблицы - messages (сообщения), files (файлы). Мне необходимо распределить права на каждое сообщение и на каждый файл. Как мне хранить ресурсы, так?:

    id | object_id | alias
    1 | 1 | 'messages'
    2 | 2 | 'messages'
    3 | 1 | 'files'
    4 | 2 | 'files'


т.е. в alias я указываю таблицу, а object_id - id записи в этой таблице. Но в таком случае непонятно - как организовывать доступ? Или я вообще не верным путем иду? Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VolCh

цитировать



Зарегистрирован: 21 Окт 2007 07:17:33
Сообщения: 47
Откуда: Санкт-Петербург

СообщениеДобавлено: 06 Ноя 2007 16:58:20    Заголовок сообщения: Ответить с цитатой

Завтра сам с этим разбираться буду Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Vlad

цитировать



Зарегистрирован: 02 Ноя 2007 11:45:52
Сообщения: 241

СообщениеДобавлено: 06 Ноя 2007 21:38:25    Заголовок сообщения: Ответить с цитатой

А я по-прежнему пользуюсь obAuth, с небольшими модификациями.
Создал себе 3 группы, наделал юзеров.
Добавил хелпер, который, в зависимости от группы, отображает или нет нужные элементы, ну а компонентом "прикрыл" функции контроллера.
Осталось только решить вопрос (до сих пор небыло необходимости Smile - юзер имеет право редактировать только свой профайл. И всё.

ACL - сложнова-то, и учитывая, традиционную нехватку времени, решил не ковырять Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
KPOTOB
Гость
цитировать






СообщениеДобавлено: 07 Ноя 2007 00:43:18    Заголовок сообщения: Ответить с цитатой Изменить/удалить это сообщение

VolCh - расскажи чего нароеш - а то все что по ACL есть к прикрытию данных не относиться
Вернуться к началу
VolCh

цитировать



Зарегистрирован: 21 Окт 2007 07:17:33
Сообщения: 47
Откуда: Санкт-Петербург

СообщениеДобавлено: 07 Ноя 2007 00:58:48    Заголовок сообщения: Ответить с цитатой

Вот это http://www.ibm.com/developerworks/ru/edu/os-php-cake2/section5.html читал?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 07 Ноя 2007 06:34:14    Заголовок сообщения: Ответить с цитатой

VolCh писал(а):
Вот это http://www.ibm.com/developerworks/ru/edu/os-php-cake2/section5.html читал?


Да, конечно читал. Но судя по описанию, все распределения прав и дальнейшая проверка осуществляется по алиасам. В таком случае я не вижу логики хранить id в object_id. Вот и решил, что либо дока не совсем точная, либо я совсем запутался. Вот и хочу услышать советов от людей которые уже использовали ACL.

Т.е. если следовать описанию, то мои ресурсы будут выглядеть так:
    id | object_id | alias
    1 | 1 | 'messages_1'
    2 | 2 | 'messages_2'
    3 | 1 | 'files_1'
    4 | 2 | 'files_2'

при этом проверяя право, object_id учавствовать вобще не будет:

Код:

// ... здесь процедуры получения информации о файле в $fileInfo
// теперь проверяем доступ пользователя к файлу
if ($this->Acl->check($this->Session->read('user'), 'files_' . $fileInfo['id'], 'read')) {
   // ...
}


Получается что поле object_id работает только тогда, когда ресурсы сложены в одну таблицу! Или всеже я заблуждаюсь?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VolCh

цитировать



Зарегистрирован: 21 Окт 2007 07:17:33
Сообщения: 47
Откуда: Санкт-Петербург

СообщениеДобавлено: 08 Ноя 2007 00:34:34    Заголовок сообщения: Ответить с цитатой

Я сейчас разбираюсь с ACL в 1.2, если у тебя 1.1 то, там вроде имя модели в таблице aco хранить нельзя и очевидных нет решений.. если только сделать еще одну таблицу куда пихать подряд id мессаг и файлов, а уж её id пихать в object_id

Для твоей проблемы решение для 1.2 вроде вот http://bakery.cakephp.org/articles/view/how-to-use-acl-in-1-2-x, довольно понятно.

А вот я что-то не могу разобраться, если ухожу от модели таблицы и доступ по действиям хочу давать. Вот только действия эти на одну таблицу или один id в таблице не завязаны и что указывать в model и foreign_id совсем не понятно, да и в parent_id тоже.

Попробую сейчас в гуглегруппе спросить буржуйской Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 08 Ноя 2007 07:23:15    Заголовок сообщения: Ответить с цитатой

У меня версия 1.1. Решение для себя нашел. В aco просто забил на object_id и полностью использую alias.

Организовал следующую структуру в aco (указаны имена alias):
Код:
model.all
   model.message
      model.message.1
      model.message.2
      ...
   model.file
      model.file.1
      model.file.2
      ...

Таким образом если необходимо дать доступ на все модели, например суперадмину, то я даю ему полные права на model.all, если на отдельную модель, то даю model.<name>, если на запись - model.<name>.<id>.
При проверки id пользователя всегда знаю, модель тоже известна, и соответственно id запрашиваемого элемента.
Заодно определяю доступ пользователя к разделам сайта, т.е. если у пользователя нет доступа, например, к модели post, значит и контроллер posts для него закрыт.
Пока такая схема работает.

Версию 1.2. Даже еще не рассматривал.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 08 Ноя 2007 08:12:01    Заголовок сообщения: Ответить с цитатой

По доступу к контроллеру погорячился. Такая схема не совсем подходящая. Если у пользователя есть доступ только к одной записи модели, но нет доступа на всю модель, то в таком случае контроллер его отбреет и он не увидит доступной для него записи.
Здесь лучше организовать свою ветку aco:
Код:
all
   model.all
      model.message
         model.message.1
         model.message.2
         ...
      model.file
         model.file.1
         model.file.2
         ...
   controller.all
      controller.messages
         controller.messages.index
         controller.messages.comments
         controller.messages.view

Тут мы выиграем на том, что можем раздавать права не только на контроллер, но и на действия.
Схему не проверял, как раз этим буду заниматься.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VolCh

цитировать



Зарегистрирован: 21 Окт 2007 07:17:33
Сообщения: 47
Откуда: Санкт-Петербург

СообщениеДобавлено: 08 Ноя 2007 14:26:29    Заголовок сообщения: Ответить с цитатой

Во, то что мне нужно.. Вот только обязательно с алиасами работать для контролеров?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 08 Ноя 2007 14:40:03    Заголовок сообщения: Ответить с цитатой

VolCh писал(а):
Вот только обязательно с алиасами работать для контролеров?

Исходя из имеющихся методов - да. Т.к. все методы Acl (назначение прав, проверка) в параметрах требуют алисы.
Здесь проблем не возникает, узнать контроллер всегда можно - $this->params['controller'] или $this->name.

И еще. Сегодня попробовал запустить Acl на версии 1.2, и не фига не заработало Sad. Создавать aco и aro методом create не хочет, даже не ругается, просто не создает. Добавлял ручками в БД и методом save (метод модели), после чего проверить права не мог, метод check дает ошибку - "неудачная проверка, aro - такой-то, aco - тако-то".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 12 Ноя 2007 09:09:25    Заголовок сообщения: Ответить с цитатой

VolCh, больше не разбирался с ACL? На версии 1.2 работает?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 13 Ноя 2007 12:40:59    Заголовок сообщения: Ответить с цитатой

короче, нарыл следующее... можно делать еще проще!
делаем Аросы, где корнем будет User, и вложения id пользователей (пишу только алисы):
Код:
User
   1
   2
   3

делаем Акосы, где корнями будут имена моделей, а вложения это id элементов этих вложений (также только алисы):
Код:
Message
   1
   2
   3
File
   1
   2
   3

теперь можно раздавать права и проверять следующим образом:
Код:
//даем доступ юзеру 1 на файл 2
$this->Acl->allow('User/1', 'File/2', '*');

//проверяем доступ изменения у юзера 3 на сообщение 3
$this->Acl->check('User/3', 'Message/3', 'update');

Это работает в 1.2 для 1.1 не проверял. И так не не нашел где применяются поля 'model', 'foreign_key', в выше указанной схеме, все работает на алисах, все запросы генерируются через алисы, хотя было бы проще работать через эти поля.
_________________
На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ztalker

цитировать



Зарегистрирован: 06 Ноя 2007 14:00:26
Сообщения: 26
Откуда: Новосибирск

СообщениеДобавлено: 13 Ноя 2007 14:01:06    Заголовок сообщения: Ответить с цитатой

в 1.1 эта схема не работает
_________________
На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
cyberfox

цитировать



Зарегистрирован: 20 Янв 2008 14:50:10
Сообщения: 16

СообщениеДобавлено: 26 Мар 2008 19:33:02    Заголовок сообщения: Ответить с цитатой

Вот пример работы с ARO и ACO в ACL cakePHP 1.2 Может кому пригодится:

Код:

<?php
   class AclsController extends AppController{
      var $components = array('Acl');
      var $uses = array('Aro', 'Aco');
      
      function init(){
          $this->Aco->create();
          $this->Aco->save(array(
                   'model'=>'',
                   'foreign_key'=>null,
                   'parent_id'=>null,
                   'alias'=>'AdminModules'));            
                  
          $this->Aco->recursive=0;
          $parent = $this->Aco->findByAlias('AdminModules');
           $parentId = $parent['Aco']['id'];       

          
           $this->Aco->create();
          $this->Aco->save(array(
                'model'=>'Modules',
                'foreign_key'=>1,
                'parent_id'=>$parentId,
                'alias'=>'AdminModules::1'));
         
          $this->Aco->create();
          $this->Aco->save(array(
                'model'=>'Modules',
                'foreign_key'=>2,
                'parent_id'=>$parentId,
                'alias'=>'AdminModules::2'));

          $this->Aro->create();
          $this->Aro->save(array(
               'model'=>'',
               'foreign_key'=>null,
               'parent_id'=>null,
               'alias'=>'Guest'));
         
          $this->Aro->create();
          $this->Aro->save(array(
               'model'=>'Admins',
               'foreign_key'=>null,
               'parent_id'=>null,
               'alias'=>'Admin'));
         
          $parent = $this->Aro->findByAlias('Admin');
             $parentId = $parent['Aro']['id'];   
         
             $this->Aro->create();
             $this->Aro->save(array(
               'model'=>'Admins',
               'foreign_key'=>1,
               'parent_id'=>$parentId,
               'alias'=>'Admin::1'));
         

            
           $this->Acl->allow('Admin', 'AdminModules', '*');
           $this->Acl->allow('Guest', 'AdminModules', array());   
               
      }
   }
?>
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru