gpt4 book ai didi

symfony - 是否可以通过编程方式查看 URL/路由是否受防火墙保护?

转载 作者:行者123 更新时间:2023-12-04 15:36:36 24 4
gpt4 key购买 nike

如果用户尝试访问 protected URL 并且是 ,我需要运行一些代码。不是 认证/授权。

默认情况下,Symfony 通过将用户重定向或转发到登录表单来处理未经身份验证的用户。如果请求方法是 POST,我想防止这种情况发生,而是回显一个 JSON 对象。

我能想到的最好的处理方法是创建一个自定义监听器来监听 kernel.request事件并检查两件事:

  • 检查请求方法是否为 POST
  • 检查用户是否完全
    认证

  • 如果它是一个 POST 请求,并且用户没有完全通过身份验证,我会回显一个 JSON 对象。

    但是我的监听器(预计)会触发所有请求 - 我想将其限制为仅检查请求是否针对受防火墙保护的 URL。是否可以通过编程方式进行检查?

    我也有一个唠叨的怀疑有一个更简单的方法来解决这个问题,但无法弄清楚,所以如果有人有任何提示,我很想听听他们:)

    编辑
    @Problematic - 只检查防火墙请求的原因是因为我有一些没有防火墙的请求,如果我的代码被触发,我将收到上述 JSON 对象而不是请求的真实响应。

    现在,如果我没有登录并向 api/get/something 发出 POST 请求(位于防火墙后面),Symfony 返回描述登录页面的 HTML。相反,我只想回显 {error: 'User is not authorized'} 之类的内容.但我只希望这种情况发生在 POST 请求中。

    最佳答案

    我想我做错了。我想知道一个 URL 是否在防火墙后面,但我想我应该一直在尝试找出当前用户是否已获得请求的授权。从本质上讲,知道用户被拒绝访问 URL 意味着该 URL 必须位于防火墙后面,否则访问不会被拒绝。

    牢记这一点,我能够得到我想要的最终结果。一旦你意识到安全机制是如何工作的,这很简单......

  • Symfony\Component\Security\Http\Firewallkernel.request事件
  • 防火墙然后调用许多在 security.yml 中注册的事件监听器。
  • 如果检测到任何安全违规(即用户试图在未登录的情况下访问某些内容),则会出现 AccessDeniedException被抛出,kernel.exception事件被调度。
  • Symfony/Component/Security/Http/Firewall/ExceptionListener监听事件并触发它的onKernelException决定下一步是什么的方法。在我的情况下,它将启动身份验证过程

  • 由于我想避免启动身份验证过程,因此我编写了自己的事件监听器来拦截 kernel.exception在 Symfony 的 ExceptionListener 之前做。我给我的事件监听器优先级为 1。

    这是我写的方法:
    public function handleException(GetResponseForExceptionEvent $event) {
    $exception = $event->getException();
    $request = $event->getRequest();
    if ($request->getMethod() == 'POST') {
    if ($exception instanceof AccessDeniedException) {
    $response = new Response({err: 'not logged in'});
    $event->setResponse($response);
    }
    }
    }

    只要用户未被授权,并且请求方法是 POST,就会返回一个 JSON 对象(这也停止事件传播),而不是登录页面的 HTML。否则, kernel.exception 的其他听众将使用react,Symfony 可以继续其业务。

    因此,最初的问题仍未得到解答,但我认为可以通过检查用户是否有权访问操作来完成。 Symfony\Component\Security\Core\Authorization\AccessDecisionManager看起来这会有所帮助。

    编辑
    我不知道此方法是否仅处理未登录的用户。我尚未对其进行测试,但我认为如果(已登录)用户尝试访问需要他们拥有的角色的操作,它也会触发没有被授予。如果这会导致问题,我会尝试修改它以使用 Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverisFullFledged($token)方法只关心未登录的用户。

    关于symfony - 是否可以通过编程方式查看 URL/路由是否受防火墙保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757728/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com