Первый вопрос
Пожалуйста, не могли бы вы объяснить мне, как самый простой 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 в каждый метод контроллера, но нам не нужны никакие дополнительные зависимости!
Следующий подход - сделать все методы контроллера закрытыми
и добавить код 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 в родительский контроллер, но нам все равно нужно сохранить все методы дочернего контроллера закрытыми.
Какое решение? И каков наилучший метод? Где я должен вызывать функции Acl, чтобы разрешить или запретить выполнение метода.
Второй вопрос
Второй вопрос касается получения роли с помощью Acl. Представим, что у нас есть гости, пользователи и друзья пользователя. Пользователь ограничил доступ к просмотру своего профиля, его могут просматривать только друзья. Все гости не могут просматривать профиль этого пользователя. Итак, вот логика ...
Основной вопрос касается определения владельца профиля. Мы можем определить, кто является владельцем профиля, только выполнив метод модели $ model-> getOwner (), но Acl не имеет доступа к модели. Как мы можем это реализовать?
Надеюсь, что мои мысли ясны. Извините за мой английский.
Спасибо.
Одна из возможностей - обернуть все контроллеры в другой класс, расширяющий Controller, и делегировать все вызовы функций обернутому экземпляру после проверки авторизации.
Вы также можете сделать это выше по течению, в диспетчере (если у вашего приложения он действительно есть), и искать разрешения на основе URL, вместо методов управления.
edit: Нужно ли вам обращаться к базе данных, серверу LDAP и т.д. - это ортогональный вопрос. Я имел в виду, что вы можете реализовать авторизацию на основе URL, а не методов контроллера. Это более надежно, потому что вы, как правило, не будете менять свои URL (область URL является своего рода публичным интерфейсом), но вы можете с тем же успехом изменить реализацию своих контроллеров.
Как правило, у вас есть один или несколько конфигурационных файлов, в которых вы сопоставляете определенные шаблоны URL с определенными методами аутентификации и директивами авторизации. Диспетчер, прежде чем отправить запрос контроллерам, определяет, авторизован ли пользователь, и прерывает отправку, если нет.