如何绝对禁用 FOSUserBundle 中的注册
How to definitely disable registration in FOSUserBundle
在我的项目中,我只允许一个用户管理网站的内容。该用户将首先使用命令行添加。
现在,我想让注册操作无法访问,但我不知道该怎么做?
到现在为止,我只是把ROLE_ADMIN放在路由寄存器的访问控制中,避免访问者可以扔掉它。
有什么建议吗?
有很多方法可以解决这个问题。您可以简单地从 routing.yml 中删除 fos_user_registration_register 路由。或者使用更复杂的解决方案:为 FOS\UserBundle\FOSUserEvents::REGISTRATION_INITIALIZE 事件设置事件侦听器并将用户重定向到登录页面。
services.xml
<service id="app.registration.listener" class="AppBundle\EventListener\RegistrationListener">
<tag name="kernel.event_subscriber" />
<argument type="service" id="router" />
</service>
RegistrationListener.php
<?php
namespace AppBundle\EventListener;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RegistrationListener implements EventSubscriberInterface
{
/**
* @var UrlGeneratorInterface
*/
private $router;
/**
* @param UrlGeneratorInterface $router
*/
public function __construct(UrlGeneratorInterface $router) {
$this->router = $router;
}
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInitialize',
];
}
public function onRegistrationInitialize(GetResponseUserEvent $event)
{
$url = $this->router->generate('fos_user_security_login');
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
这就是我解决这个问题的方法...
首先你必须在 services.yml 文件中定义你的监听器:
services:
registrationListner:
class: App\YourBundle\Listener\RegistrationListener
arguments: [@service_container]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
然后创建您的 class RegistrationListener:
<?php
namespace App\YourBundle\Listener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class RegistrationListener
{
private $router;
public function __construct(ContainerInterface $container){
$this->router = $container->get('router');
}
public function onKernelRequest(GetResponseEvent $event)
{
$route = $event->getRequest()->attributes->get('_route');
if ($route == 'fos_user_registration_register') {
//here we're gonna to redirect to you_route for example, I guess in the most cases it will be the index...
$event->setResponse(new RedirectResponse($this->router->generate('your_route')));
}
}
}
希望对您有所帮助。
另一个简单的解决方案(我使用的那个)是 overwrite the registerAction()
default FOSUserBundle
controller method:
namespace Acme\UserBundle\Controller;
use FOS\UserBundle\Controller\RegistrationController as FOSRegistrationController;
use Symfony\Component\HttpFoundation\Request;
class RegistrationController extends FOSRegistrationController
{
public function registerAction(Request $request)
{
return $this->redirectToRoute('getStarted', array(), 301);
}
}
这样做会使其他路由处于活动状态,作为确认页面。
我只是覆盖了注册操作并将用户重定向到我的第一个注册页面 (getStarted)。
你可以只更改 app/config/security.yml:
- { path: ^/register, role: ROLE_ADMIN }
从默认值 (IS_AUTHENTICATED_ANONYMOUSLY) 更改为 ROLE_ADMIN,它将停止允许匿名用户访问 /register 表单。
看看从
导入的路由配置
vendor/friendsofsymfony/user-bundle/Resources/config/routing/all.xml
如果您只需要基本的安全操作,只需导入
@FOSUserBundle/Resources/config/routing/security.xml
而不是
@FOSUserBundle/Resources/config/routing/all.xml
这样您就可以简单地select您想要使用哪些组件(安全、配置文件、重置,change_password)或者只从这些组件导入特定路由。
如果您使用 JMSSecurityExtraBundle,您可以像这样使用 denyAll
指令:
- { path: ^/register, access: denyAll }
您可以尝试改变您的 routing.yml
fos_user_registration_register:
path: /register{trailingSlash}
defaults: { _controller: AcmeBundle:Default:register, trailingSlash : "/" }
requirements: { trailingSlash : "[/]{0,1}" }
并在您的 DefaultController 中
public function registerAction(Request $request)
{
return $this->redirectToRoute('404OrWhatYouWant');
}
在我的项目中,我只允许一个用户管理网站的内容。该用户将首先使用命令行添加。
现在,我想让注册操作无法访问,但我不知道该怎么做? 到现在为止,我只是把ROLE_ADMIN放在路由寄存器的访问控制中,避免访问者可以扔掉它。
有什么建议吗?
有很多方法可以解决这个问题。您可以简单地从 routing.yml 中删除 fos_user_registration_register 路由。或者使用更复杂的解决方案:为 FOS\UserBundle\FOSUserEvents::REGISTRATION_INITIALIZE 事件设置事件侦听器并将用户重定向到登录页面。
services.xml
<service id="app.registration.listener" class="AppBundle\EventListener\RegistrationListener">
<tag name="kernel.event_subscriber" />
<argument type="service" id="router" />
</service>
RegistrationListener.php
<?php
namespace AppBundle\EventListener;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class RegistrationListener implements EventSubscriberInterface
{
/**
* @var UrlGeneratorInterface
*/
private $router;
/**
* @param UrlGeneratorInterface $router
*/
public function __construct(UrlGeneratorInterface $router) {
$this->router = $router;
}
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInitialize',
];
}
public function onRegistrationInitialize(GetResponseUserEvent $event)
{
$url = $this->router->generate('fos_user_security_login');
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
这就是我解决这个问题的方法...
首先你必须在 services.yml 文件中定义你的监听器:
services:
registrationListner:
class: App\YourBundle\Listener\RegistrationListener
arguments: [@service_container]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
然后创建您的 class RegistrationListener:
<?php
namespace App\YourBundle\Listener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class RegistrationListener
{
private $router;
public function __construct(ContainerInterface $container){
$this->router = $container->get('router');
}
public function onKernelRequest(GetResponseEvent $event)
{
$route = $event->getRequest()->attributes->get('_route');
if ($route == 'fos_user_registration_register') {
//here we're gonna to redirect to you_route for example, I guess in the most cases it will be the index...
$event->setResponse(new RedirectResponse($this->router->generate('your_route')));
}
}
}
希望对您有所帮助。
另一个简单的解决方案(我使用的那个)是 overwrite the registerAction()
default FOSUserBundle
controller method:
namespace Acme\UserBundle\Controller;
use FOS\UserBundle\Controller\RegistrationController as FOSRegistrationController;
use Symfony\Component\HttpFoundation\Request;
class RegistrationController extends FOSRegistrationController
{
public function registerAction(Request $request)
{
return $this->redirectToRoute('getStarted', array(), 301);
}
}
这样做会使其他路由处于活动状态,作为确认页面。
我只是覆盖了注册操作并将用户重定向到我的第一个注册页面 (getStarted)。
你可以只更改 app/config/security.yml:
- { path: ^/register, role: ROLE_ADMIN }
从默认值 (IS_AUTHENTICATED_ANONYMOUSLY) 更改为 ROLE_ADMIN,它将停止允许匿名用户访问 /register 表单。
看看从
导入的路由配置vendor/friendsofsymfony/user-bundle/Resources/config/routing/all.xml
如果您只需要基本的安全操作,只需导入
@FOSUserBundle/Resources/config/routing/security.xml
而不是
@FOSUserBundle/Resources/config/routing/all.xml
这样您就可以简单地select您想要使用哪些组件(安全、配置文件、重置,change_password)或者只从这些组件导入特定路由。
如果您使用 JMSSecurityExtraBundle,您可以像这样使用 denyAll
指令:
- { path: ^/register, access: denyAll }
您可以尝试改变您的 routing.yml
fos_user_registration_register:
path: /register{trailingSlash}
defaults: { _controller: AcmeBundle:Default:register, trailingSlash : "/" }
requirements: { trailingSlash : "[/]{0,1}" }
并在您的 DefaultController 中
public function registerAction(Request $request)
{
return $this->redirectToRoute('404OrWhatYouWant');
}