模块没有acl命令拒绝方法。我总是要添加控制器和索引?我有一个管理模块和默认模块,其中有十几个控制器和三十几个动作,它真的很令人厌烦
我的代码就像这样
class Management_Access extends Zend_Controller_Plugin_Abstract{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
// set up acl
$acl = new Zend_Acl();
// add the roles
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('administrator'), 'guest');
// add the resources
$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new Zend_Acl_Resource('error'));
$acl->add(new Zend_Acl_Resource('login'));
//admin resources
$acl->add(new Zend_Acl_Resource('destination'));
$acl->add(new Zend_Acl_Resource('home'));
$acl->add(new Zend_Acl_Resource('page'));
$acl->add(new Zend_Acl_Resource('tour'));
$acl->add(new Zend_Acl_Resource('hotel'));
是否有办法检查资源是否已在acl中注册?
UPDATE :: 我的默认模块中有8个控制器,'admin'模块中有9个控制器。
我在管理模块和默认模块中都有索引控制器。如果我添加允许访客索引,访客也可以访问管理模块中的索引页面。管理模块仅为管理员设置
答案 0 :(得分:4)
两种可能的解决方案:
$request->getModuleName()
)您只需将模块+控制器视为资源,将操作视为特权:
$acl->deny('guest', 'adminmodulename:controllername', array('tour', 'hotel'));
或所有人:
$acl->deny('guest', 'adminmodulename:controllername');
是否有办法检查资源是否已在acl中注册?
$ ACL的&的至少一个具有($资源)
答案 1 :(得分:1)
答案 2 :(得分:0)
我理解你的问题。我建议你使你的应用程序模块化。对于ACL,也可以将其向上移动(也就是将模块作为资源)!
e.g。
// ROLES
$this->addRole(new Zend_Acl_Role('guest')); // default
$this->addRole(new Zend_Acl_Role('Marketing'), 'guest'); // 15
// RESOURCES (MY MODULES)
$this->add(new Zend_Acl_Resource('auth'));
$this->add(new Zend_Acl_Resource('takeon'));
// PRIVILEGES
//
// default
$this->deny();
//
// guest
$this->allow('guest', 'auth');
// 15 Marketing
$this->allow('Marketing', 'default');
$this->allow('Marketing', 'takeon', array('index', 'ben10cards'));
然后在你的插件中使用:
// OBTAIN CONTROL LIST
$acl = new Auth_Model_Acl();
// OBTAIN RESOURCE
$module = $request->getModuleName();
$controller = $request->getControllerName();
// VALIDATE
if ($acl->isAllowed($role, $module, $controller)) {
$allowed = true;
您可能没有可用于操作的资源,但对我来说效果更好:)