【问题标题】:access level management for module in zend frameworkZend框架中模块的访问级别管理
【发布时间】:2011-01-27 11:23:03
【问题描述】:

模块没有acl order deny方法吗?我总是必须添加控制器和索引吗?我有一个管理模块和一个默认模块,里面有十几个控制器和三打操作,真的很烦人

我的代码是这样的

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中注册?

更新:: 我的默认模块中有八个控制器,“管理”模块中有九个控制器。

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

【问题讨论】:

  • 请详细说明,给我们看示例代码。

标签: zend-framework


【解决方案1】:

两种可能的解决方案:

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

更新后编辑:

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

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

或全部:

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

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

$acl->有($resource)

【讨论】:

  • 能否请您解释一下如何添加资源模块
  • 资源只是字符串。 $acl->addResource('modulenamehere')。你如何检查对acl的访问?控制器插件?向我们展示代码。你想做什么?允许或拒绝(哪个?)模块?
  • 嗨,我有这个想法,像这样:$this->_acl->deny('guest', 'admin:auth' , array('first')); 但它告诉我这个错误Fatal error: Uncaught exception 'Zend_Acl_Exception' with message 'Resource 'admin:auth' not found' in E:\xampp\php\PEAR\Zend\Acl.php:347 Stack trace#0 E:\xampp\php\PEAR\Zend\Acl.php(624): Zend_Acl->get('admin:auth') #1 E:\xampp\php\PEAR\Zend\Acl.php(503): Zend_Acl->setRule('OP_ADD', 'TYPE_DENY', 'guest', 'admin:auth', Array, NULL) #2 ...
【解决方案2】:

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

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

“我总是必须添加控制器和索引吗?”是什么意思?

【讨论】:

  • 我有两个模块 default 和 admin。而且他们都有很多控制器和很多动作,我不能简单地为模块设置这个访问规则
【解决方案3】:

我明白你的问题。我建议您将应用程序模块化。对于 ACL,只需将其向上移动(也就是让您的模块成为资源)!

例如

// 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多