0

如果用户未登录(与 FOSUser 和 SonataAdmin 一起使用)并调用http://domain.com/app_dev.php(dev)或http://domain.com(prod),我正在尝试重定向,那么我希望在这两种情况下都重定向到,/login所以我在以下位置编写了这个配置app/routing.yml

root:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /login
        permanent: true

那行得通,但我有一个问题,因为我在控制器中有这个:

/**
 * @param Request $request
 *
 * @return array
 * @Route("/", name="brand")
 * @Method("GET")
 * @Template()
 */
public function indexAction(Request $request)
{
    ....
}

然后,当我尝试brand使用以下链接按照示例调用路由时:http://domain.com/app_dev.php/?email=7x-xRFClkjw(dev) 或http://domain.com/?email=7x-xRFClkjw(prod) 我被重定向到/login. 我最好的想法是将我的代码更改为:

/**
 * @param Request $request
 *
 * @return array
 * @Route("/bp", name="brand")
 * @Method("GET")
 * @Template()
 */
public function indexAction(Request $request)
{
    ....
}

然后使用路由重定向到新的/bp而不是/该功能(这主要是因为用户已经有大量的电子邮件具有以前共享的链接,我无法更改)。但我不知道如何写这个规则,routing.yml因为如果我写了这个:

bp:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: brand
        permanent: true

我将结束一个重定向循环。我还可以更改默认路由/login的设置方式,我只是找不到正确的文档。这篇文章背后的大想法是为/. 任何人都可以给我一些帮助吗?

作为额外信息,这是我security.yml文件的一部分:

firewalls:
    ...

    admin_area:
        pattern: ^/
        anonymous: ~
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider

            # the user is redirected here when they need to log in
            login_path: /login

            # submit the login form here
            check_path: /login_check

            # login success redirecting options (read further below)
            always_use_default_target_path: true
            default_target_path: /admin/dashboard
            target_path_parameter: _target_path
            use_referer: false
            failure_path: /admin/dashboard
            failure_forward: false
        logout:
            path:   /logout

更新

实际上来自@emmanuel-hdz-díaz 的代码给了我另一个想法,我不需要创建内核侦听器或添加太多代码,只需在我的控制器上执行此操作即可:

if ($request->query->get('email')) {
    ...
} else {
    return $this->redirect($this->generateUrl('sonata_user_admin_security_login'));
}

我能够将用户重定向到/login路线。

4

3 回答 3

1

不确定我是否理解,但您想限制对整个网站的访问?在这种情况下,只需简单地更改您的安全设置,永远不要添加重定向到登录,因为它总是重定向到登录,即使使用已登录。这是简单的配置示例:

security:
    firewalls:
        main:
            pattern: ^/
            anonymous: true

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: ROLE_USER }
于 2015-08-29T16:52:19.220 回答
1

试试这个:

在 yourAction() 内的控制器中:

//

$usr = $this->get('security.context')->getToken()->getUser();

if( $usr == 'anon.' )
{
return $this->redirect($this>generateUrl('sonata_user_admin_security_login'));
}

//

于 2015-08-29T18:19:09.940 回答
1

抛出一个特殊异常,在 kernel.request 事件中捕获它,从那里重定向。您必须创建一个自定义异常,您可以将您的路线存储在。例如:

class RouteException extends \Exception{
    protected $route;

     public function __construct($route){
         $this->route = $route;
    }

    public function getRoute() { return $this->route; }
}

RedirectResponse现在创建一个侦听器,当它检测到此异常时将生成一个,例如:

class RedirectExceptionListener{
  protected $router;

  public function __construct(RouterInterface $router){
    $this->router;
  }

  public function onException(GetResponseForExceptionEvent $event){

    $e = $event->getException();

    if($e instanceof RouteException){

      $url = $this->router->generate($e->getRoute());

      $event->setResponse(
        new RedirectResponse($url);
      );
    }
  }
}

# the service definition
your_listener:
    class: RedirectExceptionListener
    arguments:
        - @router
    tags:
        - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

注意:您必须use使用所用类的名称空间。
这基本上是您可以从应用程序中的任何位置重定向的方法,尽管它看起来确实是对异常的恶臭使用,因此请创建一个Redirecter带有为您抛出异常的方法的服务redirect($route),因此调用服务将不知道重定向是如何进行的正在完成。Redirecter可以抛出异常或执行重定向到给定路由所需的任何操作。
有关事件侦听器的更多信息,请参阅事件侦听器

更新:这正是 symfonylogin_path在您未通过身份验证时将您重定向到您的方式,请参阅ExceptionListener

于 2015-09-01T05:32:10.590 回答