3

我的 symfony 项目中有一条路线受到限制,所以如果我尝试在没有登录的情况下前往那里,我将被重定向到登录页面。

我想区分当我试图在没有登录的情况下进入限制区域时,以及当我直接进入登录页面时。

有关如何在 symfony 中执行此操作的任何线索?

更新 通过区分我的意思是通过某种方式检查用户是否通过直接转到该 url 登陆登录页面,或者用户是否因为试图访问受限页面而登陆登录页面。

4

3 回答 3

6

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为对您有意义的内容。

于 2013-10-20T23:31:50.223 回答
4

你试过了$this->get('request')->headers->get('referer')吗?

get('referer')只会返回内部和相对路径。如果您打开test.com并单击指向您的应用程序的链接get('referer')将返回null。因此,如果用户点击重定向,下一个请求应该有正确的 URL。

否则,您可以创建自定义异常侦听器并捕获任何AccessDeniedException. 当代码捕获到一个时,您可以使用FlashBag通过重定向传递值。

于 2013-10-20T22:14:16.590 回答
0

除了 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');
    // ...
}
于 2017-07-15T19:09:18.080 回答