Как построить внутренний контроль доступа для функций сайта в CakePHP - PullRequest
0 голосов
/ 03 мая 2011

Сегодня я подробно ознакомился с руководствами и примерами для компонентов CakePHP Acl и Auth.Я настроил свой компонент Auth для использования $this->Auth->authorize = 'actions'.Благодаря этому я смог без проблем успешно ограничить доступ к определенным действиям на сайте.

Однако мое приложение должно пойти немного дальше, и я не уверен в том, как лучше всего достичь своих целей для этого приложения.

В приложении, которое я разрабатываю с использованием CakePHP 1.3.8, есть определенные «особенности сайта».Например, пользователи приложения будут иметь возможность отправлять сообщения друг другу.

Я хочу рассматривать каждое сообщение как ACO, чтобы я мог контролировать, кто может, а не может просматривать или удалять сообщение.

Еще одна особенность сайта - получение "значков" для достижения определенных целей.,Для этих значков я хотел бы рассматривать их как ACO для блокировки и разблокировки этих значков.

Я не думаю, что смогу сделать это с помощью встроенной функциональности ACL CakePHP какэто выходит за рамки ограничения доступа к действиям.Я ищу любые идеи о том, как лучше всего достичь этой функциональности.

Ответы [ 2 ]

0 голосов
/ 03 мая 2011

Я изучил Acl-компонент Cake гораздо ближе и подумал, что могу написать что-то, что имитирует эту функциональность, для моей внутренней «функции» контроля доступа. Я думаю, что у меня могут быть таблицы Faro (объекты запроса доступа к функциям), Faco и Facos_Faros. Фасо и Фаро будут иметь отношения с HABTM. Затем я мог бы создать свой собственный компонент, который управляет всем этим.

0 голосов
/ 03 мая 2011

Со стандартной функциональностью ACL в CakePHP возможно только создание записей ACO для действий контроллера. Это означает, что ваши настройки (обработка каждого отдельного сообщения как отдельного ACO) не будут выполняться. То же, что и со значками.

Для ваших сообщений я бы выбрал настройку, в которой вы будете проверять ваши методы просмотра / редактирования / удаления, если определенный пользователь является отправителем или получателем сообщения.

Что-то вроде

# in messages_controller
function view($id) {
    if(!$isSender($loggedInUserId) || !$isReceiver($loggedInUserId)) {
        $this->Session->setFlash("You're not allowed to view this message")
        $this->redirect('index');
    }
    # do view stuff here    
}
function edit($id) {
    if(!$isSender($loggedInUserId)) {
        $this->Session->setFlash("You're not allowed to edit this message")
        $this->redirect('index');
    }
    # do edit stuff here    
}

Что касается значков, я бы выбрал обычное отношение HABTM (HasAndBelongsToMany) между User и Badge. Когда User достигает определенной цели, вы делаете вызов, подобный Badge::unlock($badge, $user), который сохраняет новый значок для пользователя в таблице users_badges.

Оттуда вы можете выполнять основные действия, такие как перечисление всех значков для определенного пользователя и т. Д.

...