|
Cake-PHP.ru Форум программистов CakePHP (на сайт)
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 записи в этой таблице. Но в таком случае непонятно - как организовывать доступ? Или я вообще не верным путем иду? |
|
Вернуться к началу |
|
|
VolCh
цитировать
Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
|
Добавлено: 06 Ноя 2007 16:58:20 Заголовок сообщения: |
|
|
Завтра сам с этим разбираться буду |
|
Вернуться к началу |
|
|
Vlad
цитировать
Зарегистрирован: 02 Ноя 2007 11:45:52 Сообщения: 241
|
Добавлено: 06 Ноя 2007 21:38:25 Заголовок сообщения: |
|
|
А я по-прежнему пользуюсь obAuth, с небольшими модификациями.
Создал себе 3 группы, наделал юзеров.
Добавил хелпер, который, в зависимости от группы, отображает или нет нужные элементы, ну а компонентом "прикрыл" функции контроллера.
Осталось только решить вопрос (до сих пор небыло необходимости - юзер имеет право редактировать только свой профайл. И всё.
ACL - сложнова-то, и учитывая, традиционную нехватку времени, решил не ковырять |
|
Вернуться к началу |
|
|
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 тоже.
Попробую сейчас в гуглегруппе спросить буржуйской |
|
Вернуться к началу |
|
|
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, и не фига не заработало . Создавать 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 пользователей (пишу только алисы):
делаем Акосы, где корнями будут имена моделей, а вложения это 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());
}
}
?> |
|
|
Вернуться к началу |
|
|
|
|
Вы можете начинать темы Вы можете отвечать на сообщения Вы можете редактировать свои сообщения Вы можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group Русская поддержка phpBB
|