Цепные адаптеры Zend_Auth и роль владельца - PullRequest
0 голосов
/ 08 сентября 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 11 сентября 2011

вы можете создавать свои собственные классы адаптера / хранилища, реализуя 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 на каждый запрос.

...