Первый вопрос
Пожалуйста, не могли бы вы объяснить мне, как самый простой ACL может быть реализован в MVC.
Вот первый подход использования Acl в контроллере...
<?php
class MyController extends Controller {
public function myMethod() {
//It is just abstract code
$acl = new Acl();
$acl->setController('MyController');
$acl->setMethod('myMethod');
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
Это очень плохой подход, и это минус - нам нужно добавить часть кода Acl в каждый метод контроллера, но нам не нужны никакие дополнительные зависимости!
Следующим подходом является создание всех методов контроллера private
и добавление кода ACL в метод контроллера __call
.
<?php
class MyController extends Controller {
private function myMethod() {
...
}
public function __call($name, $params) {
//It is just abstract code
$acl = new Acl();
$acl->setController(__CLASS__);
$acl->setMethod($name);
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
Это лучше, чем предыдущий код, но основные минусы...
- Все методы контроллера должны быть закрыты
- Мы должны добавить код ACL в каждый метод __call контроллера.
Следующий подход заключается в том, чтобы поместить Acl-код в родительский контроллер, но нам все равно нужно сохранить все методы дочернего контроллера.
Какое решение? И в чем лучшая практика? Где я могу вызвать функции Acl для принятия решения о разрешении или запрете метода, который должен быть выполнен.
Второй вопрос
Второй вопрос - получить роль, используя Acl. Представьте, что у нас есть гости, пользователи и друзья друзей. Пользователь имеет ограниченный доступ к просмотру своего профиля, который могут просматривать только друзья. Все гости не могут просматривать этот профиль пользователя. Итак, вот логика.
- мы должны обеспечить, чтобы вызываемый метод был профилем
- мы должны определить владельца этого профиля
- мы должны определить, является ли зритель владельцем этого профиля или нет
- мы должны прочитать правила ограничения этого профиля
- нам нужно решить выполнить или не выполнить метод профиля
Основной вопрос заключается в обнаружении владельца профиля. Мы можем определить, кто является владельцем профиля, только используя модельный метод $model- > getOwner(), но у Acl нет доступа к модели. Как мы можем это реализовать?
Я надеюсь, что мои мысли ясны. Извините за мой английский.
Спасибо.