Адаптеры цепочки Zend_Auth и роль владения acl

Я установил схему Zend_Acl и Zend_Auth, в которой пользователь аутентифицируется с помощью Zend_Auth_Adapter_Ldap и сохраняется в сеансе. Я использую подключаемый модуль контроллера, чтобы проверить, отображают ли $auth->hasIdentity() и $acl->isAllowed() форму входа в систему, если это необходимо.

Я хочу добавить файлы cookie для входа (моя реализация лучших практик) и ключи API в дополнение к проверка сеанса в Zend_Auth. Мне также нужно переключить роль на «владелец» контента, созданного пользователем.

Мои опасения:

  • Файл cookie для входа в систему следует использовать только в качестве запасного варианта, если обычная аутентификация сеанса завершается неудачно, и, таким образом, сеанс должен быть аутентифицирован.
  • Ключи API следует использовать в качестве запасного варианта, если не удается как файл cookie входа, так и файл cookie сеанса.
  • Я не хочу нигде хранить пароль, он должен находиться только в LDAP
  • Мне нужно постоянное хранение идентификационной информации, так как ее поиск в LDAP невозможен без полного имени пользователя и пароля.
  • Роль зависит как от членства в группе LDAP (которая должна постоянно храниться), так и от того, следует ли считать личность владельцем контента (что означает, что она меняется между запросами, если только не администратор).

Какой хороший шаблон / подход для решения этой проблемы с использованием Zend Framework MVC и Zend_Auth + Zend_Acl?


person Jon Skarpeteig    schedule 08.09.2011    source источник


Ответы (1)


вы можете создать свои собственные классы адаптера / хранилища, реализовав Zend_Auth_Adpater_Interface и Zend_Auth_Storage_Interface

В этих классах вы можете повторно использовать оригинальные адаптеры (например, LDAP) или хранилища и писать только код, реализующий ваши правила аутентификации.

например, используя несколько источников для Zend_Auth_Adapter:

<?php 
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface
{
    private $ldapAdapter;
    private $cookieAdapter;
    private $apiKeyAdapter;

    public function __construct($ldapAdapter, $cookieAdapter, $apiKeyAdapter) {
    {
        $this->ldapAdapter = $ldapAdapter;
        $this->cookieAdapter = $cookieAdapter;
        $this->apyKeyAdapter = $apiKeyAdapter;
    }
    public function authenticate()
    {
         if ($this->ldapAdapter->authenticate()) {
             //return the Zend_Auth_Restult
         } elseif ($this->cookieAdapter->authenticate() {
            //return the result
         } elseif ($this->apiKeyAdapter->authenticate() {
           //return the result
         } else {
           //Create and return a Zend_Auth_Result which prevents logging in
          }
     }
}

Я не уверен, что понимаю ваши правила входа в систему, но концепция остается той же для класса Storage:

 <?php 
 class My_Auth_Storage implements Zend_Auth_Storage_Interface
  private $sessionStorage;
  private $cookieStorage;
  private $apiStorage;

  public function read()
  {
      if (!$this->sessionStorage->isEmpty())
      {
           return $this->sessionStorage->read();
      } elseif (!$this->cookieStorage->isEmpty())
      { 
           return $this->cookieStorage->read();
      } //And so one, do not forget to implement all the interface's methods

С этой реализацией у вас может быть несколько источников учетных данных и несколько механизмов хранения сеансов (cookie, сеанс, база данных или все, что вы хотите использовать).

Что касается ваших проблем с acl, вы можете получить группу LDAP в плагине вашего контроллера и сохранить ее там, где вам нужно, после аутентификации. Затем вы можете использовать второй плагин, который проверяет ACL по каждому запросу.

person Benjamin Dubois    schedule 11.09.2011