2017-04-01 110 views
0

在使用Symfony2重写应用程序时,我试图保留一些传统行为,并且正在寻找干净的解决方案。根据身份验证路由到不同的控制器

我的目标是有URI“/”显示启动页面,如果用户没有登录,同一个URI显示每个用户的仪表板,如果他们已登录。

该解决方案还需要可扩展性 - “公共”网站上有几个页面在“私人”网站上有不同的表示(即索引,支持,关于,联系等) - 因此,我不能简单地使用catch-全部路由并自己转发给正确的控制器。

我有一个潜在的解决方案,我将作为答案发布,但我正在寻求更好方法的建议。

回答

0

N.B.这个答案是一种黑客行为;我发布它希望找到更好的方法。实现这一

的一种方法是利用路由系统的支持下为conditions - 这并没有影响URL生成并允许路由系统照顾参数的优势,等

然而,为了将条件用于此目的,我们需要通过Request或RequestContext(仅有的两个可用变量)公开请求的身份验证状态。

这可以通过创建在RouterListener之前运行的EventListener并将认证状态存储在请求的属性中来完成。

不幸的是,如event reference所示,防火墙只在RouterListener之后运行,这意味着我们的侦听器中不存在身份验证状态。

据我所知,唯一的解决方案是修改优先级,使防火墙先运行,然后运行我们的新EventListener,最后运行RouterListener。这几乎肯定是一个坏主意,并且可能会导致意想不到的效果。

我很欢迎任何有关如何实现这一目标的更好建议。

0

我在symfony3上,但这是我的方法。登录后,我将所有用户发送到/ login/redirect,并使用下面显示的控制器。这很简单,并使用内置的ROLES_ *功能。

/** 
* Redirect users after login based on various checks 
* 
* @Route("/login/redirect", name="_login_redirect") 
*/ 
public function loginRedirectAction() 
{ 
    // Send user to admin page or order page based on credentials 
    if ($this->isGranted('ROLE_SUPERUSER')) { 
     return $this->redirectToRoute('admin_home'); 
    } elseif ($this->isGranted('ROLE_ADMIN')) { 
     return $this->redirectToRoute('dashboard'); 
    } else { 
     return $this->redirectToRoute('order_page'); 
    } 
} 

要处理那些未登录,我在我的树枝模板中使用一些简单的逻辑。请注意,symfony自动为所有登录用户提供ROLES_USER角色。

{% if is_granted('ROLE_USER') %} 
     {# User is logged in, do something appropriate #} 
     <li>{{ app.user ? app.user.name : '' }}</li>&nbsp; 
     {# Useful stuff #} 
    {% else %} 
     {# Show login link, or give other info #} 
     <li><a href="{{ path('security_login') }}">Login</a></li> 
    {% endif %}