2016-04-30 191 views
0

在Symfony2/3项目中,如果匿名用户位于半保护页面上(其中页面的部分内容仅显示给登录用户),并且他们单击一个链接,指出“登录查看更多详细信息',我如何将它们重定向到登录后所在的页面?登录后Symfony重定向

由于Symfony安全框架自动处理重定向,这与他们点击完全受保护页面的链接时不同。

有没有像这样的内置内容,或者我将不得不添加它?我正在考虑在登录页面的链接末尾添加一个查询参数,名称为redirect。例如,在嫩枝,

<a href="{{ path('login_route', {'redirect': '/profile/123'}) }}"> 
    Sign in to view more details 
</a> 

这将使作为

<a href="/user/login?redirect=/profile/123">Sign in to view more details</a> 

如果此功能已经不存在了,我知道我将不得不在LoginController添加一些东西到loginCheckAction(其目前没有被使用,因为路由是由安全系统处理的),但我不知道如何。

Here是Security Bundle的配置页面,其中列出了所有的选项,但是我找不到任何关于我在找什么的东西。

回答

0

尽管Krukov的回答并没有解决我的问题,但确实让我朝着正确的方向前进。如documentation中所述,您可以添加一个name属性_target_path的隐藏表单输入到登录表单,并且它将尝试重定向到此输入的值。

所以在我的LoginController ::在loginAction,我检查,如果有一个目前redirect查询参数,如果是这样,它发送到树枝模板,并添加隐藏的输入:

public function loginAction(Request $request) 
{ 
    $page = $this->templating->render('AppBundle::login.html.twig', [ 
     'redirect' => $request->query->get('redirect') ?: null, 
    ]); 

    return new Response($page); 
} 

在模板:

<form action="{{ path('login_check') }}" method="post"> 
    {% if redirect %} 
     <input name="_target_path" type="hidden" value="{{ redirect }}"> 
    {% endif %} 

    <label for="username">Username</label> 
    <input type="text" id="username" name="_username" value="{{ last_username }}" required> 

    <label for="password">Password</label> 
    <input type="password" id="password" name="_password" required> 

    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> 
    <button type="submit">Sign in</button> 
</form> 

(多余代码删除。)

+0

请注意,这不是傻瓜。如果用户输入正确的用户名和密码,它就可以工作。但是,如果他们输入错误,那么它会跳回到登录页面并显示一条错误消息 - 但重定向查询参数已消失。 – user128216

1

您应该添加一个监听器登录您的安全包的成功事件,或者,或者扩展包和实现自己的登录动作里面 (documentation

+0

这似乎对我的需要过于复杂。我遇到了一个可能更简单的解决方案(请参阅我对Krukov的回答的评论),我将尝试。 – user128216

0

您可以直接在应用程序中使用“default_target_path”/config/security.yml 看看这些文档:http://symfony.com/doc/current/cookbook/security/form_login.html

+0

不,这不是我要找的。我不希望这种行为发生在每次登录时,只是在某些情况下。但是阅读那个文档页面,我偶然发现了一个潜在的解决方案。如果名为'_target_path'的隐藏字段被添加到登录表单中,它将覆盖默认的重定向。因此,我所要做的就是在'LoginController :: LoginAction'函数中检查是否有一个名为'redirect'的查询参数,如果存在,则将隐藏的'_target_path'输入添加到登录表单中。我明天就试试,如果有效,请将其作为自我回答。 – user128216