首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“非授权”访问控制逻辑放在哪里,似乎不适合ACL?

“非授权”访问控制逻辑放在哪里,似乎不适合ACL?
EN

Stack Overflow用户
提问于 2011-01-22 19:09:59
回答 2查看 700关注 0票数 0

我想知道“非授权”访问控制逻辑,例如。一个人只能在顶级待办事项中添加子代待办事项。它似乎不适合ACL,而它似乎更适合于身份验证/授权访问控制逻辑?

我是否要将所有内容都放入ACL中?我必须以某种方式显示不同的错误信息,例如。‘您不能执行此操作’,而不是‘您没有足够的权限执行此操作’...我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-23 00:22:53

您应该在访问列表对象之外处理访问逻辑。为此,我创建了一个frontController插件:

代码语言:javascript
复制
class Soflomo_Controller_Plugin_Access extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup (Zend_Controller_Request_Abstract $request)
    {
        if (!$this->_isAllowed($request)) {
            throw new Zend_Controller_Action_Exception('No permission', 403);
        }
    }

    protected function _isAllowed (Zend_Controller_Request_Abstract $request, $permission = 'view')
    {
        $acl = new Acl(); // Here your logic to fetch a (cached) ACL
        $role = new User(); // Here your logic to fetch role
        $resource = new Page(); // Here your logic to fetch resource

        return $acl->hasRole($role)
            && $acl->has($resource)
            && $acl->isAllowed($role, $resource, $permission);
    }
}

在本例中,我显式地检查角色和资源是否存在。这是因为我的数据库中只有ACL规则,其中角色有权访问资源。所有其他情况(当用户没有访问权限时),我将其留在数据库之外。

当您有不同的逻辑时,检查$acl->isAllowed($role, $resource, $permission);并去掉$acl->hasRole()$acl->has()可能就足够了。

错误处理程序

我抛出了一个错误代码为403的Zend_Controller_Action_Exception,但是如果您没有捕捉到特定的代码,它看起来就像是一个普通的应用程序错误。因此,我在ErrorHandler frontController插件中添加了另一个常量EXCEPTION_NO_PERMISSION,并将其添加到switch语句中:

代码语言:javascript
复制
case 'Zend_Controller_Action_Exception':
if (404 == $exception->getCode()) {
    $error->type = self::EXCEPTION_NO_ACTION;
} elseif (403 == $exception->getCode()) {
    $error->type = self::EXCEPTION_NO_PERMISSION;
} else {
    $error->type = self::EXCEPTION_OTHER;
}
break;

然后,您可以在您的ErrorController中获取错误类型EXCEPTION_NO_PERMISSION

票数 0
EN

Stack Overflow用户

发布于 2011-01-25 04:22:58

最常见的方法是处理控制器插件中的逻辑。这在大多数情况下都很有效,但我建议将逻辑存储在您的模型中。

ACL也是一个模型。

任何模型/表单/类都可以通过提供getResourceId()方法来实现Zend_Acl_Resource_Interface:例如

代码语言:javascript
复制
abstract class My_Form_Acl extends Zend_Form {

    public function __construct() {
       // ...
       parent::__construct();
    }

    public function getResourceId()
    {
       return get_class($this);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4767464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档