我正在使用带有 FOS UserBundle 的 Symfony,我想阻止经过身份验证的用户访问登录、注册或密码重置页面。任何访问这些页面的尝试都会导致重定向到主页。
我读过您可以复制控制器来进行这些更改,但这意味着在有更新时手动更新复制的代码并再次应用这些更改,这并不理想。
还有可能使用事件订阅者。这是我的实现,用于阻止注册表单,但是我仍然可以访问重置页面和登录页面。
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
class FOSUserSubscriber implements EventSubscriberInterface
{
/**
* @var Router
*/
protected $router;
/**
* @var TokenStorage
*/
private $tokenStorage;
public function __construct(Router $router, TokenStorage $tokenStorage)
{
$this->router = $router;
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_INITIALIZE => 'forwardToRouteIfUser',
FOSUserEvents::RESETTING_RESET_REQUEST => 'forwardToRouteIfUser',
FOSUserEvents::RESETTING_RESET_INITIALIZE => 'forwardToRouteIfUser', //['forwardToRouteIfUser',-100]
FOSUserEvents::RESETTING_RESET_SUCCESS => 'forwardToRouteIfUser',
FOSUserEvents::RESETTING_RESET_COMPLETED => 'forwardToRouteIfUser',
);
}
public function forwardToRouteIfUser(GetResponseUserEvent $event)
{
if (!$this->tokenStorage->getToken()->isAuthenticated()) {
return;
}
$url = $this->router->generate('home');
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
服务.yml
Foo\BarBundle\EventListeners\FOSUserSubscriber:
arguments: ['@router','@security.token_storage']
tags:
- { name: kernel.event_subscriber }
如果使用控制器确实是唯一的方法,请提供一个不涉及复制大块代码的示例。
版本:
"friendsofsymfony/user-bundle": "^2.0",
"symfony/symfony": "3.4.*",