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