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

查看:93
本文介绍了为已定义的路由添加条件例外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to deny the access for a defined route, to members that has a flag set to true in the database. So for example, I could add a starting condition to each action like:

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

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

but there are too many actions and different controllers that match routes to be denied.

因此,我正在考虑创建一条新的路线(重复路线),该路线将在执行其他任何操作之前执行该操作(如果需要则执行此操作)。可能吗?

So I'm thinking about creating a new route(repeated) which will execute that action(deny if it has to do so), before any other action. Is it possible?

推荐答案

在过滤器执行此操作之前。请阅读文档:之前

Before filter should do the trick. Please read documentation: Before filters with the kernel.controller Event.

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

If you have a lot of routes/controllers or you don't like implement interfaces you could simply implement event listener for kernel.request event:

# 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));
        }
    }
}

这篇关于为已定义的路由添加条件例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆