页面授权Zend Framework的最佳方法?

时间:2014-03-31 07:52:11

标签: php zend-framework

我有一个页面:如果usertypeadmin,则该页面可以查看(并搜索)所有记录,但usertypestandard user他/她只能查看和搜索他/她自己的记录。

Zend Framework建议为best practice。我目前正在使用Zend ACL,所以如果我分开行动,那么我必须根据actions更改菜单以指向不同的usertype in session

我可以使用controller checking the usertype中的方法并在操作和视图中进行相关更改。

最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

  

着名的ACL示例:

     

在Blog控制器中,有publishAcion(),viewAction(),   editAction(),deleteAction()。

     

对于未注册的用户,我们限制他发布,编辑和删除帖子的权限。

     

因此,您的问题与此用例类似:已注册   用户可以编辑自己的帖子,而管理员可以编辑所有帖子,理想情况下使用相同的editAction()。

根据用户的角色返回不同的结果更多是您的业务逻辑。好消息是你不必写多个动作。实际上,这可能不是一个糟糕的决定,因为您将应用程序分为两个部分:前端和管理面板。这听起来很熟悉吗?

有三种方法:

控制器方法

public function viewAction(){

    $record = new Model_Record();

    switch (Zend_Auth::getInstance()->getIdentity()->getRole()){
        case 'admin':
            $recordResult = $record->getAllRecords(); break;
        case 'standard user':
            $recordResult = $record->getRecordsByUserId(Zend_Auth::getInstance()->getIdentity()->getId()); break;
}

通过使用基于角色的两个动作getAllRecords()和getRecordsByUserId(),这是合乎逻辑的。您可以保持模型操作的简单性。

行动助手方法

这一方法进一步扩展了上述方法。有时您必须在不同的控制器中多次使用控制器方法。要减少重复代码(始终是最好的代码),请编写控制器操作助手:http://framework.zend.com/manual/1.12/en/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown

<强> /library/Application/Controller/Action/Helper/GetRecordsBasedOnRole.php

class Application_Controller_Action_Helper_GetRecordsBasedOnRole extends Zend_Controller_Action_Helper_Abstract
{

    public function direct()
    {

        $record = new Model_Record();
        $recordResult = array();

        switch (Zend_Auth::getInstance()->getIdentity()->getRole()){
            case 'admin':
            $recordResult = $record->getAllRecords(); break;
        case 'standard user':
            $recordResult = $record->getRecordsByUserId(Zend_Auth::getInstance()->getIdentity()->getId()); break;

        return $recordResult;
    }
}

不要忘记告诉Zend它在哪里,将此行添加到 Application.ini

  

resources.frontController.actionHelperPaths.Application_Controller_Action_Helper =“Application / Controller / Action / Helper /”

然后您可以使用一行代码在每个控制器中使用它:

$recordResult = $this->_helper->getRecordsBasedOnRole();

模型方法

function getRecordsBasedOnRole(){

    $select = "SELECT * FROM recordTable";

    if (Zend_Auth::getInstance()->getIdentity()->getRole() != 'admin'){
        $select .= " WHERE id = " . Zend_Auth::getInstance()->getIdentity()->getId();
    }
    ...
}

通过这种方法,您将能够在所有控制器中使用getRecordsBasedOnRole()来根据用户的角色获取数据。

$record = new Model_Record();
$recordResult = $record->getRecordsBasedOnRole()

少许糖

如果您更喜欢Action Helper Approach。您可能还没有读过这篇关于动作堆栈性能问题的好文章:http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/

但是,将Zend_Auth放入模型中以检查用户的角色也不是一个好习惯,因为这会增加额外的内存使用量。

IT行业的每一项实施都是一种权衡。在这种情况下,可能没有完美的解决方案,但模型解决方案是 更好。因为现在存储很便宜。