如果未授予访问权限,我会使用重定向进行简单的ACL检查,如果发送了帖子请求,则发回401.
if (!$e->getViewModel()->acl->hasResource($route) || !$e->getViewModel()->acl->isAllowed($role, $route)) {
//Naughty trying to get somewhere they shouldn't (Clear there identity force them to login again)
$response = $e->getResponse();
//location to page or what ever
if($request->isPost())
{
$response->setStatusCode(401);
return $response;
}
else
{
return $e->getTarget()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controller = $e->getTarget();
$controller->redirect()->toRoute('auth');
}, -11);
}
}
现在我在一些SQL查询中添加了“WHERE id = user-> id”
但是因为用户没有登录,PHP会抛出通知
注意:未定义的属性:stdClass :: $ ID
并且不再重定向。
这只是在dev服务器上发生,因为prod-server没有显示错误/通知但这仍然让我真的不舒服。这是正常的还是有办法“强制”重定向?
我试图将它附加到不同的事件但不改变行为
问候
答案 0 :(得分:0)
阐述我们对这个问题的评论。 display_errors设置只是
确定是否应将错误作为一部分打印到屏幕上 输出或是否应该向用户隐藏它们。
决定应将哪些错误/警告记录到日志文件中的设置不是。如果启用了display_errors,并且未缓冲输出,则会立即将其发送到客户端(可能通过Web服务器)。 由于标头始终首先发送到客户端,因此应用程序会在输出警告消息之前发送200 OK状态代码。因此,您尝试发送的任何状态代码都将丢失。这就是你的401重定向无法在你的开发机器上运行的原因。
答案 1 :(得分:0)
好的问题只是我没有返回重定向... 如果你在ZF2中返回它将中断当前进程,否则它会将它附加到结尾。
if (!$e->getViewModel()->acl->hasResource($route) || !$e->getViewModel()->acl->isAllowed($role, $route)) {
//Naughty trying to get somewhere they shouldn't (Clear there identity force them to login again)
$response = $e->getResponse();
//location to page or what ever
if($request->isPost())
{
$response->setStatusCode(401);
return $response;
}
else
{
return $e->getTarget()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controller = $e->getTarget();
return $controller->redirect()->toRoute('auth');
}, -11);
}
}