Цепные адаптеры Zend_Auth и роль владельца

Я настроил схему 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?

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 на каждый запрос.

Другие вопросы по тегам