我想知道“非授权”访问控制逻辑,例如。一个人只能在顶级待办事项中添加子代待办事项。它似乎不适合ACL,而它似乎更适合于身份验证/授权访问控制逻辑?
我是否要将所有内容都放入ACL中?我必须以某种方式显示不同的错误信息,例如。‘您不能执行此操作’,而不是‘您没有足够的权限执行此操作’...我该怎么做呢?
发布于 2011-01-23 00:22:53
您应该在访问列表对象之外处理访问逻辑。为此,我创建了一个frontController插件:
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语句中:
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。
发布于 2011-01-25 04:22:58
最常见的方法是处理控制器插件中的逻辑。这在大多数情况下都很有效,但我建议将逻辑存储在您的模型中。
ACL也是一个模型。
任何模型/表单/类都可以通过提供getResourceId()方法来实现Zend_Acl_Resource_Interface:例如
abstract class My_Form_Acl extends Zend_Form {
public function __construct() {
// ...
parent::__construct();
}
public function getResourceId()
{
return get_class($this);
}
}https://stackoverflow.com/questions/4767464
复制相似问题