【问题标题】:Symfony - Throw an exception returning 403 from a ListenerSymfony - 抛出一个异常,从监听器返回 403
【发布时间】:2021-04-16 13:38:52
【问题描述】:

我正在使用 Symfony5ApiPlatform

我将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,我认为它会返回一个403,但实际上返回一个500

authorization 部分实际上正在工作,但我对我的逻辑中的这个“异常”有点困扰,因为其他授权规则将返回 200403

所以我的问题是:

  • 有谁知道为什么这个异常会这样?如果这是正常行为或有问题
  • 还有其他方法可以从这个Listener 返回403 吗?

感谢您的宝贵时间!

【问题讨论】:

  • "statut" 你的意思是"status"
  • 法语习惯,感谢您的意见。如果您对听众的事情有所了解,我将不胜感激
  • 我想我可以帮助您提供更多信息。所以在你的情况下,它返回了一个 500 错误代码,所以请检查 var/dev.log,也许你能找到原因。否则你能不能写一个包含“CRITICAL”的行,这样我就可以帮你调试了
  • 看文档,你可以创建一个类并使用它,或者自定义所有拒绝访问的响应symfony.com/doc/current/security/…

标签: symfony authorization listener api-platform.com access-denied


【解决方案1】:

根据documentation,您可以配置框架以捕获您的异常。

config/packages/api_platform.yaml

api_platform:
    exception_to_status:
        Symfony\Component\Security\Core\Exception\AccessDeniedException: 403

但您可能应该创建自己的 Exception 类,从 AcessDeniedException 扩展它并配置它。

src/Exception/AccessDeniedException.php

<?php

namespace App\Exception;

use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class MyAccessDeniedException extends AccessDeniedException
{
}

config/packages/api_platform.yaml

api_platform:
    exception_to_status:
        App\Exception\MyAccessDeniedException: 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.');
    }    
}

【讨论】:

  • 感谢您的回答!到目前为止,我正在执行另一项任务,但一旦我测试过(我认为这正是我所需要的),我会回来讨论这个问题,并会让你知道。
  • 您的回答确实解决了我的问题,非常感谢!
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多