为已定义的路由添加一个条件性例外[英] Add a conditional exception for a defined route

本文是小编为大家收集整理的关于为已定义的路由添加一个条件性例外的处理方法,想解了为已定义的路由添加一个条件性例外的问题怎么解决?为已定义的路由添加一个条件性例外问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想拒绝对已定义路由的访问,以拒绝在数据库中将标志设置为 true 的成员.例如,我可以为每个动作添加一个起始条件,例如:

    if ( $this->getUser()->HasPowers() ) {
        throw new AccessDeniedException;
    }

但是有太多的动作和不同的控制器匹配路由被拒绝.

所以我正在考虑创建一个新路由(重复),它将在任何其他操作之前执行该操作(如果必须这样做,则拒绝).有可能吗?

推荐答案

过滤器应该可以解决问题.请阅读文档:之前使用 kernel.controller 事件过滤.

如果你有很多路由/控制器,或者你不喜欢实现接口,你可以简单地为 kernel.request 事件实现事件监听器:

# app/config/config.yml
services:
    before_controller.listener:
        class: Acme\DemoBundle\EventListener\BeforeController
        calls:
            - [ setSecurityContext, [ "@security.context" ]]
            - [ setRouter, [ "@router" ]]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

接下来,实现监听器:

# src\Acme\DemoBundle\EventListener;
namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Security\Core\SecurityContext;

class BeforeController {
    protected $securityContext;

    protected $router;

    public function setRouter(Router $router){
        $this->router = $router;
    }

    public function setSecurityContext(SecurityContext $securityContext){
        $this->securityContext = $securityContext;
    }

    public function onKernelRequest(GetResponseEvent $event){
        if (!$this->securityContext->getToken()) {
            return;
        }

        $isUser = $this->securityContext->isGranted('ROLE_USER');

        if (!$isUser) {
            return;
        }

        $user = $this->securityContext->getToken()->getUser();

        if ($user->hasSomeFlag()) {
            $redirectUrl = $this->router->generate('some_route');
            $event->setResponse(new RedirectResponse($redirectUrl));
        }
    }
}

本文地址:https://www.itbaoku.cn/post/1793738.html