带有授权检查器的 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 监听器的主要内容,如果未能解决你的问题,请参考以下文章