我的symfony项目中有一条路由受到限制,所以如果我尝试在没有登录的情况下去那里,我会被重定向到登录页面。
我想区分何时尝试在不登录的情况下进入限制区域,以及当我直接进入登录页面时。
关于如何在symfony中做到这一点的任何线索?
更新通过区分,我的意思是某种方法可以通过直接转到该 URL 来检查用户是否登陆登录页面,或者用户是否因为试图访问受限页面而登陆登录页面。
Thomas的解决方案是一个很好的解决方案。这是一个替代方案。
知道这一点,并且只有在未登录的情况下才会重定向,您可以使用附加参数重定向安全防火墙。
安全.yml
...
secured_area:
pattern: ^/
form_login:
check_path: /login_check
login_path: /login/restricted
...
路由.yml
login:
pattern: /login
defaults: { _controller: YourBundle:Default:login }
login:
pattern: /login/{restricted}
defaults: { _controller: YourBundle:Default:login }
控制器
public function loginAction($restricted = null)
{
...
Do something with $restricted
...
现在,如果有人转到登录页面:
yoursite.com/login
一切都会正常,$restricted = null,所以你知道它们是直接来的。
如果有人去:
yoursite.com/admin
当他们未登录时,他们将被重定向到:
yoursite.com/login/restricted
在您的控制器中,将设置$restricted
,您将知道他们试图在没有身份验证的情况下访问受限区域。
当然,您可以将restricted
更改为对您有意义的内容。
你试过$this->get('request')->headers->get('referer')
吗?
get('referer')
只会返回内部和相对路径。如果您在test.com
上并单击指向您的应用程序的链接get('referer')
将返回null
。因此,如果用户点击重定向,下一个请求应该具有正确的 URL。
否则,您可以创建自定义异常侦听器并捕获任何AccessDeniedException
。当代码捕获一个时,您可以使用 FlashBag 通过重定向传递值。
除了 hcoat 答案之外,您还可以在不创建新的 URL 的情况下执行此操作。您可以使用查询参数:
secured_area:
pattern: ^/
form_login:
check_path: /login_check
login_path: /login?r
然后在控制器的操作中检查此参数:
public function loginAction(Request $request)
{
$redirected = $request->query->has('r');
// ...
}