я пытаюсь использовать фильтр перед Symfony 2.7 для проверки подлинности. мой слушатель событий выглядит следующим образом
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 говорит
Uncaught PHP Exception 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 в вашей prod env, а не только на app_dev
РЕДАКТИРОВАТЬ: это должно работать таким образом, в слушателе:
$response = new RedirectResponse("someUri", Codes::HTTP_FORBIDDEN);
$event->setResponse($response);
Других решений пока нет …