Symfony事件监听器:kernel.controller

时间:2017-05-26 05:36:25

标签: php symfony

我有一个像这样的控制器:

class ArticleController extends Controller implements AuthControllerInterface
{
    public function listAllArticleAction (Request $request)
    {
        // ... ignore
    }
    public function addArticleAction (Request $request)
    {
        // ... ignore
    }
    // ... another article control method
}

想要添加文章的用户必须登录,但是,用户无需登录即可访问listAllArticleAction。

我尝试使用Event Listener来解决问题:

class AuthListener
{
    private $m_router;

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

    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();

        if ($controller[0] instanceof AuthControllerInterface) {
            $session = $event->getRequest()->getSession()->get('userId');
            if (!isset($session)) {
                $redirectUrl = $this->m_router->generate('page.login');
                $event->setController(function () use ($redirectUrl){
                   return new RedirectResponse($redirectUrl);
                });
            }
        }
    }
}

如果用户没有登录,用户将被重定向到登录页面,但是,这种方法也会对" listAllArticleAction"生效。方法

我认为在函数开头检查会话并不是一个好主意,因为我有另一篇文章控制方法,例如" deleteArticle"," getArticle"等等,其中一些需要先登录,其他则不需要登录。

如何使用事件侦听器实现此功能?或者,有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

您正在尝试手动执行已在Symfony中实现的内容。

你有两种方法可以做到这一点。查看Security Component

的文档

在安全配置中使用 access_control部分(security.yml或通过注释)

另见How Does the Security access_control Work?

在YAML配置中,它将类似于:

security:
    access_control:        
        - { path: ^/path/to/add_article, roles: IS_AUTHENTICATED_REMEMBERED }

检查是否在操作开始时记录了使用情况

if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    throw $this->createAccessDeniedException();
}

答案 1 :(得分:0)

正确的方法是:

class ArticleController extends Controller
{
    public function listAllArticleAction (Request $request)
    {
        // ... ignore
    }
    public function addArticleAction (Request $request)
    {
        if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
            throw $this->createAccessDeniedException();
        }
        // ... ignore
    }
    // ... another article control method
}

如果您的用户未登录,他们将被重定向到登录页面