我正在尝试使用symfony 2.7的before过滤器来进行身份验证。我的事件监听器如下
class TokenListener {
protected $dm;
function __construct() {
}
public function setDocumentManager(DocumentManager $dm) {
$this->dm = $dm;
}
public function onKernelController(FilterControllerEvent $event) {
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
if ($controller[0] instanceof TokenAuthenticatedController) {
$content = $event->getRequest()->getContent();
$json = json_decode($content,true);
$authId = $json['authId'];
$authToken = $json['authToken'];
echo "authId: {$authId}, authToken: {$authToken}'n";
$user = $this->dm->getRepository('HcUserBundle:User')
->createQueryBuilder()
->field('authId')->equals($authId)
->getQuery()
->getSingleResult();
if (!isset($user) || $user->getAuthToken() != $authToken) {
throw new AccessDeniedException('This action needs a valid token!');
}
}
}
}
但我收到了500个错误,symfony错误日志显示
未捕获的PHP异常Symfony''Component''Security''Core''Exception''AccessDeniedException:"此操作需要有效的令牌!"
我没有得到403错误,而是尝试使用AccessDeniedHttpException
,但遇到了同样的问题,有人知道如何在这里生成403响应吗?感谢
您也可以只返回一个新的响应,将状态代码设置为Codes::HTTP_FORBIDDEN
return new Response("This action needs a valid token!", Codes::HTTP_FORBIDDEN);
编辑:不,这可能不起作用,因为你在一个听众。。。
编辑:你确定它在你的产品环境中也能产生500,而不仅仅是在app_dev 上吗
编辑:它应该以这种方式工作,在侦听器中:
$response = new RedirectResponse("someUri", Codes::HTTP_FORBIDDEN);
$event->setResponse($response);