【问题标题】:Symfony kernel.response listener with authorization checker带有授权检查器的 Symfony kernel.response 监听器
【发布时间】:2016-07-13 19:45:11
【问题描述】:

我正在设置一个kernel.response 事件,我想测试用户是否在其中登录。

这是我的代码:

services.yml

app.kernel.modal_injection:
    class: App\UserBundle\EventListener\ModalListener
    tags:
        - { name: kernel.event_listener, event: kernel.response }
    arguments:
        - @security.authorization_checker

ModalListener.php

<?php
namespace App\UserBundle\EventListener;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;


class ConnectModalListener implements EventSubscriberInterface
{
    protected $securityChecker;

    public function __construct( AuthorizationChecker $securityChecker )
    {
        $this->securityChecker = $securityChecker;
    }

    public function onKernelResponse( FilterResponseEvent $event )
    {
        $response = $event->getResponse();
        $request = $event->getRequest();

        if ( !$event->isMasterRequest() ) {
            return;
        }
        if ( $request->isXmlHttpRequest() ) {
            return;
        }

        if ( $this->securityChecker->isGranted( 'IS_AUTHENTICATED_REMEMBERED' ) ) {
            return;
        }

        // CODE HERE


    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => array( 'onKernelResponse', 0 ),
        );
    }
}

我的问题是,在检查用户 IS_AUTHENTICATED_REMEMBER 是否在我的页面上提供 css 和 js 文件时出现错误 500(意味着上面没有 js 或 css)。有没有办法收取这些费用?最终过滤那些上的 kernel.response 事件?

【问题讨论】:

  • 你能分享一下来自 Symfony 调试器的确切错误信息吗?您的 CSS/JS 应该始终有效。它们是静态文件。
  • 我设法解决了这个错误:Internal Server Error | Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException [message] The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL

标签: php symfony listener


【解决方案1】:

静态文件中的令牌是null,因此isGranted返回错误500。所以我必须先运行检查:

if ( $this->tokenStorage->getToken() !== null
        && $this->securityChecker->isGranted( 'IS_AUTHENTICATED_REMEMBERED' ) ) {
    return;
}

【讨论】:

  • 但是为什么你的静态文件是由 php 提供的呢?听起来像是 .htaccess 中的错误配置
  • @mblaettermann 哦:/ 我想我有 Symfony 的默认值。你有一个例子,所以我可以比较? (我不太擅长htaccess
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2016-10-16
  • 2015-12-19
相关资源
最近更新 更多