带有授权检查器的 Symfony kernel.response 监听器

Posted

技术标签:

【中文标题】带有授权检查器的 Symfony kernel.response 监听器【英文标题】:Symfony kernel.response listener with authorization checker 【发布时间】: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 【参考方案1】:

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

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

【讨论】:

但是为什么你的静态文件是由 php 提供的呢?听起来像是 .htaccess 中的错误配置 @mblaettermann 哦:/ 我想我有 Symfony 的默认值。你有一个例子,所以我可以比较? (我不太擅长htaccess

以上是关于带有授权检查器的 Symfony kernel.response 监听器的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5 作曲家更新失败并带有安全检查器

带有身份检查器的自定义 Xcode 选择器

默认解析器的身份验证/授权

Symfony 5:如何在登录前检查用户是不是被禁止

带有 SQLite 内存数据库的 Symfony / Doctrine UnitTests

装饰器的写法以及应用环境