Как я могу реализовать список управления доступом в моем веб-приложении MVC?

Первый вопрос

Пожалуйста, не могли бы вы объяснить мне, как самый простой 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 в метод __call каждого контроллера.

Следующий подход - поместить код Acl в родительский контроллер, но нам все равно нужно сохранить все методы дочернего контроллера закрытыми.

Какое решение? И каков наилучший метод? Где я должен вызывать функции Acl, чтобы разрешить или запретить выполнение метода.

Второй вопрос

Второй вопрос касается получения роли с помощью Acl. Представим, что у нас есть гости, пользователи и друзья пользователя. Пользователь ограничил доступ к просмотру своего профиля, его могут просматривать только друзья. Все гости не могут просматривать профиль этого пользователя. Итак, вот логика ...

  • мы должны убедиться, что вызываемый метод является профилем
  • , мы должны определить владельца этого профиля
  • , мы должны определить, является ли зритель владельцем этого профиля или нет
  • мы должны прочитать правила ограничения для этого профиля
  • мы должны решить, выполнять или не выполнять метод профиля

Основной вопрос касается определения владельца профиля. Мы можем определить, кто является владельцем профиля, только выполнив метод модели $ model-> getOwner (), но Acl не имеет доступа к модели. Как мы можем это реализовать?

Надеюсь, что мои мысли ясны. Извините за мой английский.

Спасибо.

94
задан Madara Uchiha 10 May 2014 в 10:07
поделиться

1 ответ

Одна из возможностей - обернуть все контроллеры в другой класс, расширяющий Controller, и делегировать все вызовы функций обернутому экземпляру после проверки авторизации.

Вы также можете сделать это выше по течению, в диспетчере (если у вашего приложения он действительно есть), и искать разрешения на основе URL, вместо методов управления.

edit: Нужно ли вам обращаться к базе данных, серверу LDAP и т.д. - это ортогональный вопрос. Я имел в виду, что вы можете реализовать авторизацию на основе URL, а не методов контроллера. Это более надежно, потому что вы, как правило, не будете менять свои URL (область URL является своего рода публичным интерфейсом), но вы можете с тем же успехом изменить реализацию своих контроллеров.

Как правило, у вас есть один или несколько конфигурационных файлов, в которых вы сопоставляете определенные шаблоны URL с определенными методами аутентификации и директивами авторизации. Диспетчер, прежде чем отправить запрос контроллерам, определяет, авторизован ли пользователь, и прерывает отправку, если нет.

13
ответ дан 24 November 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: