web-dev-qa-db-ja.com

FOSUserBundleへの登録を確実に無効にする方法

私のプロジェクトでは、1人のユーザーだけがWebサイトのコンテンツを管理できるようにしています。このユーザーは、最初にコマンドラインを使用して追加されます。

今、登録アクションにアクセスできないようにしたいのですが、方法がわかりませんか?今までは、訪問者がROLE_ADMINをス​​ローできないように、ルートレジスタのアクセス制御にROLE_ADMINを配置していました。

任意のヒント?

16
Abdou Bestmood

この問題を解決する方法はたくさんあります。単純に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);
    }
}
15

からインポートされたルーティング構成を見てください

ベンダー/friendsofsymfony/user-bundle/Resources/config/routing/all.xml

基本的なセキュリティアクションだけが必要な場合は、インポートするだけです

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

の代わりに

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

このようにして、使用するコンポーネント(セキュリティ、プロファイル、リセット、change_password)を選択するか、それらのコンポーネントから特定のルートのみをイベントインポートすることができます。

21
Petr Malina

App/config /security.ymlを変更するだけです。

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

デフォルト(IS_AUTHENTICATED_ANONYMOUSLY)からROLE_ADMINに変更すると、匿名ユーザーが/ registerフォームにアクセスできなくなります。

6
theamoeba

別の簡単な解決策(私が使用したもの)は 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)にリダイレクトするだけです。

3
Aerendir

JMSSecurityExtraBundleを使用する場合は、次のようにdenyAllディレクティブを使用できます。

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

2
nurikabe

これが私がこの問題を解決する方法です...

まず、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'))); 
    }
}
}

それが役に立てば幸い。

1
Abdou Bestmood

あなたはあなたの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');
    }
0
Shoooryuken