Я часто использую отдельные пространства имен сеансов как для моих администраторов, так и для пользовательских интерфейсов, а также отдельные списки ACL.
Имея отдельный сеанс для моей панели администратора, вошедший в систему пользователь по-прежнему не имеет возможности доступа к разделу администратора независимо от ACL, поскольку сеанс Zend_Auth для администратора полностью изолирован от сеанса пользователя.
Вот класс, который я использую для администратора, который расширяет Zend_Auth. Обратите внимание, что в getInstance он устанавливает хранилище в другое пространство имен сеанса, которое по умолчанию Zend_Auth.
<?php
class My_Admin_Auth extends Zend_Auth
{
protected function __construct()
{}
protected function __clone()
{}
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self();
self::$_instance->setStorage(new Zend_Auth_Storage_Session('Zend_Auth_admin'));
}
return self::$_instance;
}
/**
* Get an auth adapater instance suitable for authenticating agains
* the administrator database.
* @param string $username
* @param string $password
* @return Zend_Auth_Adapter_DbTable Adapter used to call $auth->authenticate($adapter);
*/
public static function getAdapter($username, $password, $usersalt)
{
$db = Zend_Controller_Front::getInstance()
->getParam('bootstrap')
->getResource('db');
$authAdapter = new Zend_Auth_Adapter_DbTable($db,
'administrators',
'username',
'password');
$authAdapter->setIdentity($username)
->setCredential($password)
->setCredentialTreatment(
'SHA1(CONCAT(?,"' . $usersalt . '"))'
);
return $authAdapter;
}
/**
* Return a SHA-1 hashed and salted version of the entered password
* @param string $plaintext Password to hash, a static salt is also applied
* @return string the hashed password
*/
public static function hashAdminPassword($plaintext, $usersalt)
{
return sha1($plaintext . $usersalt);
}
}
В качестве альтернативы, вы можете определить отдельный ACL для вашей административной области, которая по умолчанию запрещает все, а затем добавлять разрешающие правила, только если пользователь является администратором, когда создается экземпляр класса.