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