Zend Framework двойной Acl-ресурсы с модулями - PullRequest
0 голосов
/ 23 января 2012

Я установил новый модуль администратора, чтобы я мог без проблем получить доступ к этому модулю с www.example.com/admin - но я, конечно же, хочу сделать его доступным только для администраторов. Теперь контроллер, очевидно, является «индексом», а также действием. Но так как я хочу, чтобы каждый получил доступ к www.example.com, который получил контроллер и действие "index", у меня есть следующие строки в моем плагине Acl:

$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new Zend_Acl_Resource('admin:index'));

$acl->allow(null, array('index'));

// admins can do anything
$acl->allow('administrator', null);

Но, похоже, это работает и для административного модуля. Как ограничить обычных пользователей из модуля администратора? Я уже пробовал

$acl->deny('guest', 'admin:index', 'index');

но это не похоже на работу. Помощь очень ценится. Спасибо и извините за мой плохой английский.

С наилучшими пожеланиями.

1 Ответ

1 голос
/ 24 января 2012

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

...