Symfony - 重定向用户已登录

时间:2018-03-31 08:22:38

标签: symfony security fosuserbundle

如果用户尝试访问登录/注册页面,可以使用安全文件配置重定向已登录到特定路由(例如主页)的用户吗?我已经发现的一个解决方案是将一个监听器附加到EventRequest,但我更愿意使用安全配置。

2 个答案:

答案 0 :(得分:1)

经过一些谷歌搜索后,我注意到另一个解决方案是覆盖fosuserbundle控制器。但是因为我需要这个行为也适用于/ register和/ resetting页面,而不是覆盖那些控制器,我更喜欢使用EventListener。也许这是这种情况下的最佳解决方案。我使用的是Symfony 4,因此其他版本可能会有所不同。

我的代码:

namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class LoggedInUserListener
{

    private $router;
    private $authChecker;

    public function __construct(RouterInterface $router, AuthorizationCheckerInterface $authChecker)
    {
        $this->router = $router;
        $this->authChecker = $authChecker;
    }

    /**
     * Redirect user to homepage if tryes to access in anonymously path
     * @param GetResponseEvent $event
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        $path = $request->getPathInfo();
        if ($this->authChecker->isGranted('IS_AUTHENTICATED_REMEMBERED') && $this->isAnonymouslyPath($path)) {
            $response = new RedirectResponse($this->router->generate('homepage'));
            $event->setResponse($response);
        }
    }

    /**
     * Check if $path is an anonymously path
     * @param string $path
     * @return bool
     */
    private function isAnonymouslyPath(string $path): bool
    {
        return preg_match('/\/login|\/register|\/resetting/', $path) ? true : false;
    }

}

将此添加到services.yaml:

App\EventListener\LoggedInUserListener:
        tags:
            - { name: kernel.event_listener, event: kernel.request }

答案 1 :(得分:0)

@Mintendo,使用您的代码时出现错误:

request.CRITICAL: Exception thrown when handling an exception (Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: The token storage contains no authentication token.
php.CRITICAL: Uncaught Exception: The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL.

此外,调试栏也显示错误并被破坏。

但是您将我推向正确的方向,所以我对您的代码做了一些修改。 现在可以正常使用了:

<?php

namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;

class LoggedInUserListener
{
private $router;
private $security;

public function __construct(RouterInterface $router, Security $security)
{
    $this->router       = $router;
    $this->security     = $security;
}

/**
 * Redirect user to homepage if tries to access in anonymously path
 * @param GetResponseEvent $event
 */
public function onKernelRequest(GetResponseEvent $event)
{
    $request    = $event->getRequest();
    $path       = $request->getPathInfo();

    if ($this->security->getUser() && $this->isAnonymouslyPath($path)) {
        $response = new RedirectResponse($this->router->generate('dashboard'));
        $event->setResponse($response);
    }
}

/**
 * Check if $path is an anonymously path
 * @param string $path
 * @return bool
 */
private function isAnonymouslyPath(string $path): bool
{
    return preg_match('/\/login|\/register|\/resetting/', $path) ? true : false;
}
}
相关问题