如何明确禁用 FOSUserBundle 中的注册

Posted

技术标签:

【中文标题】如何明确禁用 FOSUserBundle 中的注册【英文标题】:How to definitely disable registration in FOSUserBundle 【发布时间】:2015-09-15 08:39:50 【问题描述】:

在我的项目中,我只允许一个用户管理网站的内容。此用户将首先使用命令行添加。

现在,我想让注册操作无法访问,但我不知道该怎么做? 到目前为止,我只是将 ROLE_ADMIN 放在路由寄存器的访问控制中,以避免访问者去扔它。

有什么建议吗?

【问题讨论】:

不能把注册用的路由去掉吗? 是的,但是,我不涉及 fosuserbundle 路线...无论如何,工作已经完成,问题已经解决,谢谢。 【参考方案1】:

有很多方法可以解决这个问题。您可以简单地从 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);
    

【讨论】:

感谢您的提示...我选择了第二种解决方案,因为我不想更改 fosuserbundle... @Mikhail:我怎么做第一个?我试图在app/Resources/FOSUserBundle/Resources/config/routing 中放置一个没有注册路由的 all.xml,但它不起作用? 您应该将 FOS 路由单独导入到您的 app/config/routing.yml。只需添加所需功能的路由(security.xml、resetting.xml、profile.xml、change_password.xml),registration.xml 除外。【参考方案2】:

这就是我解决这个问题的方法...

首先你必须在 services.yml 文件中定义你的监听器:

services:
    registrationListner:
      class: App\YourBundle\Listener\RegistrationListener
      arguments: [@service_container]
      tags:
    -  name: kernel.event_listener, event: kernel.request, method: onKernelRequest

然后创建你的类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'))); 
    


希望对你有帮助。

【讨论】:

哇,这比不导入注册路由要复杂得多。【参考方案3】:

另一个简单的解决方案(我使用的那个)是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)。

【讨论】:

【参考方案4】:

您只需更改 app/config/security.yml:

-  path: ^/register, role: ROLE_ADMIN 

从默认值 (IS_AUTHENTICATED_ANONYMOUSLY) 更改为 ROLE_ADMIN,它将停止允许匿名用户访问 /register 表单。

【讨论】:

【参考方案5】:

看看从

导入的路由配置

vendor/friendsofsymfony/user-bundle/Resources/config/routing/all.xml

如果您只需要基本的安全操作,只需导入

@FOSUserBundle/Resources/config/routing/security.xml

而不是

@FOSUserBundle/Resources/config/routing/all.xml

通过这种方式,您可以简单地选择要使用的组件(安全、配置文件、重置、更改密码),或者仅从这些组件中导入特定路由。

【讨论】:

【参考方案6】:

如果您使用 JMSSecurityExtraBundle,您可以像这样使用 denyAll 指令:

- path: ^/register, access: denyAll

【讨论】:

【参考方案7】:

您可以尝试更改您的 routing.yml

fos_user_registration_register:
    path:  /registertrailingSlash
    defaults:  _controller: AcmeBundle:Default:register, trailingSlash : "/" 
    requirements:  trailingSlash : "[/]0,1" 

在你的 DefaultController 中

    public function registerAction(Request $request)
    
       
        return $this->redirectToRoute('404OrWhatYouWant');
    

【讨论】:

以上是关于如何明确禁用 FOSUserBundle 中的注册的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:如何实现自定义用户登录和注册——摆脱 FOSUSerBundle

Symfony2:使用 FOSUserBundle 时如何在控制器内获取用户对象?

如何轻松登录、Symfony2 Security、FOSUserBundle、FOSRestBundle?

在使用 FOSUserBundle 进行用户注册期间添加默认角色

在 FOSUserBundle 和 Symfony2.1 注册前后保持相同的会话

将 JSON 数据发布到 FOSUserBundle 注册、登录、个人资料等