#symfony #authorization #listener #api-platform.com #access-denied
#symfony #авторизация #прослушиватель #api-platform.com #доступ запрещен
Вопрос:
Я использую Symfony5
с ApiPlatform
Я использую a Listener
для нескольких задач, в том числе для выполнения некоторых authorization
действий, которые я не могу выполнить в своих избирателях.
Итак, с помощью простого условия я проверяю, какое поле моей сущности изменяется.
Я просматриваю измененные поля и проверяю, отличаются ли они от единственного поля, которое можно изменить.
вот как :
$modifiedValues = $eventArgs->getEntityManager()->getUnitOfWork()->getEntityChangeSet($eventArgs->getObject());
foreach ($modifiedValues as $key => $value) {
if ("statut" != $key) {
throw new AccessDeniedException('Vous ne pouvez pas modifier ce champ.');
}
}
Теперь я выбрасываю AccessDeniedException
, который, как я думал, вернет a 403
, но на самом деле возвращает a 500
.
authorization
Часть на самом деле работает, но меня немного беспокоит это «исключение» в моей логике, потому что другие правила авторизации вернут либо 200
или 403
.
Итак, мои вопросы будут:
- Кто-нибудь знает, почему это исключение ведет себя таким образом? Если это нормальное поведение или что-то не так
- Есть ли другой способ вернуть a
403
из этогоListener
?
Спасибо за ваше время!
Комментарии:
1. «statut» вы имеете в виду «статус»
2. французские привычки, спасибо за ввод. Если у вас есть что-то для слушателя, я был бы благодарен
3. Я думаю, что могу помочь вам предоставить дополнительную информацию. Итак, в вашем случае он вернул код ошибки 500, поэтому, пожалуйста, проверьте var / dev.log, может быть, вы сможете найти причину. Еще вы можете поместить строку, содержащую «КРИТИЧЕСКИЙ», чтобы я мог помочь вам отладить
4. посмотрите на документ, вы можете создать класс и использовать его или настроить все ответы с отказом в доступе symfony.com/doc/current/security /…
Ответ №1:
Согласно документации, вы можете настроить фреймворк для перехвата вашего исключения.
config/packages/api_platform.yaml
api_platform:
exception_to_status:
SymfonyComponentSecurityCoreExceptionAccessDeniedException: 403
Но вам, вероятно, следует создать свой собственный класс исключений, расширить его из AcessDeniedException и настроить его.
src/Exception/AccessDeniedException.php
<?php
namespace AppException;
use SymfonyComponentSecurityCoreExceptionAccessDeniedException;
class MyAccessDeniedException extends AccessDeniedException
{
}
config/packages/api_platform.yaml
api_platform:
exception_to_status:
AppExceptionMyAccessDeniedException: 403
Listener.php
$modifiedValues = $eventArgs->getEntityManager()->getUnitOfWork()->getEntityChangeSet($eventArgs->getObject());
foreach ($modifiedValues as $key => $value) {
if ("statut" != $key) {
throw new MyAccessDeniedException('Vous ne pouvez pas modifier ce champ.');
}
}
Комментарии:
1. Спасибо за ваш ответ! На данный момент я занимаюсь другой задачей, но вернусь к этой проблеме, как только протестирую ее (что, я думаю, именно то, что мне было нужно), и дам вам знать.
2. Ваш ответ решил мою проблему, большое спасибо!