zend框架中模块的访问级别管理

时间:2011-01-27 11:23:04

标签: zend-framework

模块没有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个控制器。

我在管理模块和默认模块中都有索引控制器。如果我添加允许访客索引,访客也可以访问管理模块中的索引页面。管理模块仅为管理员设置

3 个答案:

答案 0 :(得分:4)

两种可能的解决方案:

  1. 检查控制器插件中的当前模块($request->getModuleName()
  2. 在模块引导程序中实现逻辑(仅适用于您需要的模块)。
  3. 更新后编辑:

    您只需将模块+控制器视为资源,将操作视为特权:

    $acl->deny('guest', 'adminmodulename:controllername', array('tour', 'hotel'));
    

    或所有人:

    $acl->deny('guest', 'adminmodulename:controllername');
    
      

    是否有办法检查资源是否已在acl中注册?

    $ ACL的&的至少一个具有($资源)

答案 1 :(得分:1)

这不是一个非常具体的问题:)

无论如何......您可能必须自己为ZF实施用户管理。但不要害怕,网上有很多教程! (e.g. here

你的意思是“我总是要添加控制器和索引吗?”?

答案 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;

您可能没有可用于操作的资源,但对我来说效果更好:)