Symfony — выдает исключение, возвращающее 403 от слушателя

#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. Ваш ответ решил мою проблему, большое спасибо!