Zend Framework使用模块双重Acl资源

时间:2012-01-23 00:12:16

标签: zend-framework acl

我设置了一个新模块管理员,因此我可以通过www.example.com/admin完美访问此模块 - 但我当然希望只为管理员提供此模块。现在,控制器显然是“索引”以及动作。但是,由于我希望每个人都访问www.example.com,它也获得了控制器和操作“索引”,我的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 个答案:

答案 0 :(得分:1)

我经常为我的管理员和用户前端使用单独的会话命名空间,以及单独的ACL。

通过为我的管理面板设置单独的会话,无论ACL如何,登录用户仍无法访问管理部分,因为管理员的Z​​end_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,默认情况下拒绝所有内容,然后只有在实例化类时用户是管理员时才添加允许规则。