在使用Symfony2重写应用程序时,我试图保留一些传统行为,并且正在寻找干净的解决方案。根据身份验证路由到不同的控制器
我的目标是有URI“/”显示启动页面,如果用户没有登录,同一个URI显示每个用户的仪表板,如果他们已登录。
该解决方案还需要可扩展性 - “公共”网站上有几个页面在“私人”网站上有不同的表示(即索引,支持,关于,联系等) - 因此,我不能简单地使用catch-全部路由并自己转发给正确的控制器。
我有一个潜在的解决方案,我将作为答案发布,但我正在寻求更好方法的建议。
在使用Symfony2重写应用程序时,我试图保留一些传统行为,并且正在寻找干净的解决方案。根据身份验证路由到不同的控制器
我的目标是有URI“/”显示启动页面,如果用户没有登录,同一个URI显示每个用户的仪表板,如果他们已登录。
该解决方案还需要可扩展性 - “公共”网站上有几个页面在“私人”网站上有不同的表示(即索引,支持,关于,联系等) - 因此,我不能简单地使用catch-全部路由并自己转发给正确的控制器。
我有一个潜在的解决方案,我将作为答案发布,但我正在寻求更好方法的建议。
N.B.这个答案是一种黑客行为;我发布它希望找到更好的方法。实现这一
的一种方法是利用路由系统的支持下为conditions - 这并没有影响URL生成并允许路由系统照顾参数的优势,等
然而,为了将条件用于此目的,我们需要通过Request或RequestContext(仅有的两个可用变量)公开请求的身份验证状态。
这可以通过创建在RouterListener之前运行的EventListener并将认证状态存储在请求的属性中来完成。
不幸的是,如event reference所示,防火墙只在RouterListener之后运行,这意味着我们的侦听器中不存在身份验证状态。
据我所知,唯一的解决方案是修改优先级,使防火墙先运行,然后运行我们的新EventListener,最后运行RouterListener。这几乎肯定是一个坏主意,并且可能会导致意想不到的效果。
我很欢迎任何有关如何实现这一目标的更好建议。
我在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>
{# Useful stuff #}
{% else %}
{# Show login link, or give other info #}
<li><a href="{{ path('security_login') }}">Login</a></li>
{% endif %}