Подтвердить что ты не робот

Как определенно отключить регистрацию в FOSUserBundle

В моем проекте я разрешаю только одному пользователю управлять содержимым веб-сайта. Этот пользователь будет добавлен с помощью командной строки сначала.

Теперь я хочу, чтобы действие регистрации было недоступным, и я не знаю, как это сделать? До сих пор я просто поместил ROLE_ADMIN в элемент управления доступом для регистра маршрутов, чтобы избежать того, чтобы посетители могли его бросить.

Любые советы?

4b9b3361

Ответ 1

Существует много способов решить эту проблему. Вы можете просто удалить fos_user_registration_register маршрут из routing.yml. Или используйте более сложное решение: настройте прослушиватель событий на 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);
    }
}

Ответ 2

Взгляните на конфигурацию маршрутизации, импортированную из

продавец/friendsofsymfony/пользовательский пакет/Ресурсы/конфигурация/маршрутизация/all.xml

Если вы хотите только основные действия безопасности, просто импортируйте

@FOSUserBundle/Ресурсы/конфигурации/маршрутизации/security.xml

вместо

@FOSUserBundle/Ресурсы/конфигурация/маршрутизация/all.xml

Таким образом вы можете просто выбрать, какие компоненты (безопасность, профиль, сброс, change_password) вы хотите использовать, или импортировать события только определенные маршруты из этих компонентов.

Ответ 3

Вы можете просто изменить app/config/security.yml:

- { path: ^/register, role: ROLE_ADMIN }

Измените значение по умолчанию (IS_AUTHENTICATED_ANONYMOUSLY) на ROLE_ADMIN, и оно перестанет позволять анонимным пользователям получать информацию в форме/register.

Ответ 4

Еще одно простое решение (тот, который я использовал): перезаписать метод контроллера registerAction() по умолчанию FOSUserBundle:

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).

Ответ 5

Вот как я решаю эту проблему...

Сначала вы должны определить своего слушателя в файле 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'))); 
    }
}
}

Надеюсь, что это поможет.

Ответ 6

Если вы используете JMSSecurityExtraBundle, вы можете использовать директиву denyAll следующим образом:

- { path: ^/register, access: denyAll }