Php 向FOSUserBundle注册用户而不登录用户
我正在尝试使用FOSUserBundle实现注册。我希望管理员能够注册一个新用户,我只需将注册更改为防火墙路由(/admin/register prefix) 我创建了一个自定义注册表单类型,并按照以下说明将其注册为服务: 然后,我根据以下内容连接到注册事件: 我的听众是这样的:Php 向FOSUserBundle注册用户而不登录用户,php,symfony,fosuserbundle,Php,Symfony,Fosuserbundle,我正在尝试使用FOSUserBundle实现注册。我希望管理员能够注册一个新用户,我只需将注册更改为防火墙路由(/admin/register prefix) 我创建了一个自定义注册表单类型,并按照以下说明将其注册为服务: 然后,我根据以下内容连接到注册事件: 我的听众是这样的: use FOS\UserBundle\FOSUserEvents; use FOS\UserBundle\Event\FilterUserResponseEvent; use Symfony\Component\Eve
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RegistrationListener implements EventSubscriberInterface
{
private $router;
public function __construct(UrlGeneratorInterface $router)
{
$this->router = $router;
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_COMPLETED => 'onRegisterDone',
FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegisterDone',
FOSUserEvents::RESETTING_RESET_COMPLETED => 'onRegisterDone',
);
}
public function onRegisterDone(FilterUserResponseEvent $event)
{
$url = $this->router->generate('admin_panel');
//$event->setResponse(new RedirectResponse($url));
}
}
FilterUserResponseEvent没有setResponse方法,所以我只是让它运行。我认为订阅此事件将覆盖默认的FOS\UserBundle\EventListener\AuthenticationListener订阅事件,并阻止用户登录,但新用户仍会登录
是否可以阻止身份验证,或者我只是创建一个新表单来调用调用用户管理器的操作?您也可以覆盖注册控制器来执行此操作。() 您只需要删除一行
$this->authenticateUser($user)代码>和用户在注册后将不会进行身份验证
重写控制器以仅删除此行不是一个好方法。但是,如果您无法覆盖正确的侦听器并在正确的时刻挂接,那么这可能是尽快完成任务的最简单方法;-) 也有同样的问题,这对我来说很有效
注释掉覆盖的注册控制器中的此行:
$dispatcher->dispatch(FOSUserEvents::注册完成,新过滤器响应事件($user,$request,$response))
在不覆盖整个控制器的情况下,这里有一个更干净的版本:
是的,我知道注射整个容器是不好的做法,但这是一个快速的解决方案b
class RegistrationListener implements EventSubscriberInterface
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_CONFIRMED => ['onRegistrationConfirm', 999],
);
}
public function onRegistrationConfirm(FilterUserResponseEvent $filterUserResponseEvent){
$user = $filterUserResponseEvent->getUser();
$user_manager = $this->container->get('fos_user.user_manager');
$user->setEnabled(false);
$user->setLocked(true);
$user_manager->updateUser($user);
}
}
这就是我重定向到管理面板所做的。我使用了REGISTRATION_SUCCESS事件(它使用FormEvent而不是FilterUserResponseEvent)
为了防止身份验证,我必须重写AuthenticationListener,如中所述。这是我的AuthenticationListener:
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\EventListener\AuthenticationListener as FOSAuthenticationListener;
class AuthenticationListener extends FOSAuthenticationListener
{
public static function getSubscribedEvents()
{
return array(
// do not authenticate after registration
// FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate',
// FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate'
FOSUserEvents::RESETTING_RESET_COMPLETED => 'authenticate',
);
}
}
做一个简单的表单(重复使用现有的注册表单类型),它只使用用户管理器。也许在某个时候,我会遇到如何禁用默认功能。是的,我认为这可能是一个解决方案,但我不认为当我部署到其他地方并使用composer重新下载包时,这将是一个可持续的选择。感谢分享。我已经走了另一条路,但如果我重新考虑这个问题,我可能会这样做。在再次查看这里的回复后,我注意到我第一次误解了Michael的答案。
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RegistrationListener implements EventSubscriberInterface
{
private $router;
public function __construct(UrlGeneratorInterface $router)
{
$this->router = $router;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
);
}
public function onRegistrationSuccess(FormEvent $event)
{
$url = $this->router->generate('admin_users');
$event->setResponse(new RedirectResponse($url));
}
}
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\EventListener\AuthenticationListener as FOSAuthenticationListener;
class AuthenticationListener extends FOSAuthenticationListener
{
public static function getSubscribedEvents()
{
return array(
// do not authenticate after registration
// FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate',
// FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate'
FOSUserEvents::RESETTING_RESET_COMPLETED => 'authenticate',
);
}
}