我设置了一个新模块管理员,因此我可以通过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');
但这似乎不起作用。非常感谢帮助。谢谢,对不起我的英语不好。
最诚挚的问候。
答案 0 :(得分:1)
我经常为我的管理员和用户前端使用单独的会话命名空间,以及单独的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,默认情况下拒绝所有内容,然后只有在实例化类时用户是管理员时才添加允许规则。