Symfony2,如何使用自定义功能在一个地方保护所有控制器?

时间:2012-06-15 19:38:05

标签: security symfony

我已经定义了我的控制器,但我想保护所有这些,如下所示:

// In my Controller Class 
public function chooseDateAction()
{
    if($this->get('MY.roles_features')
            ->isGranted($this->container->get('request')->get('_route')))
    {
         // Do something 

    }
    else
    {
        throw new AccessDeniedException();
    }


    return array( );
}

我必须设计自己的'isGranted'函数,因为roles是动态的。 BTW功能正常!

所以我的问题是我是否必须在我的所有isGranted中重复Controllers函数,或者我可以将它放在某处以减少代码冗余。

我知道我必须将isGranted放在我安全的顶级层中,但问题是如何以及在何处?

1 个答案:

答案 0 :(得分:5)

尝试编写一个基本控制器,如果isGranted方法通过,将检查构造,否则抛出异常。 e.g:

<?php

namespace Acme\DolanBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class BaseController extends Controller
{

    public function __construct()
    {
         if(!$this->get('MY.roles_features')
                  ->isGranted($this->container->get('request')->get('_route')))
        {
         throw new AccessDeniedException('Gooby pls');
        }
    }
}

然后只需在其他控制器中扩展BaseController。