在 services.yalm 上收听这两个事件:
App\Listener\FirewallTokenController:
tags:
- { name: kernel.event_listener, event: kernel.controller }
App\Listener\FirewallTokenRequest:
tags:
- { name: kernel.event_listener, event: kernel.request }
FirewallTokenRequest 首先运行。您可以在其中检索一个或多个令牌并执行验证。如果令牌正确,我们什么也不做,让执行继续,但如果令牌不正确,我们会引入一个自定义错误,我们可以在 FirewallTokenController 中恢复并执行重定向。
如果在 FirewallTokenRequest 中令牌不正确,我们会插入错误:
public function onKernelRequest(RequestEvent $event) {
$request = $event->getRequest();
...
.....
if (badToken){
$request->attributes->set("FirewallTokenEvent", "401");
} else {
//Enter the user or any data that is needed in the Controller
$request->attributes->set("idUser", $idUser);
$request->attributes->set("email", $email);
$request->attributes->set("locale", $locale);
}
}
我们从 FirewallTokenController 中寻找错误,如果我们找到了我们可以重定向:
$this->classesExcluded = array("Symfony\Bundle\WebProfilerBundle\Controller\ProfilerController");
public function onKernelController(ControllerEvent $event) {
$controller = $event->getController(); (deprecated)
//In each request this class is executed 2 times, this makes it possible to execute it only once.
if (!is_array($controller) || HttpKernelInterface::MASTER_REQUEST != $event->getRequestType() || in_array(get_class($controller[0]), $this->classesExcluded)) {
return;
}
if ($request->attributes->has('FirewallTokenEvent')) {
$response = intval($request->attributes->get('FirewallTokenEvent'));
if ($response == 401) { //Unathorizated
$redirectUrl = 'unauthorized';
$event->setController(function () use($redirectUrl) {
return new RedirectResponse($redirectUrl);
});
}
从控制器检索在 FirewallTokenRequest 中输入的用户(或任何数据):
$idUser = intval($request->attributes->get('idUser'));
$email = $request->attributes->get('email');
$locale = $request->attributes->get('locale');