私のプロジェクトでは、1人のユーザーだけがWebサイトのコンテンツを管理できるようにしています。このユーザーは、最初にコマンドラインを使用して追加されます。
今、登録アクションにアクセスできないようにしたいのですが、方法がわかりませんか?今までは、訪問者がROLE_ADMINをスローできないように、ルートレジスタのアクセス制御にROLE_ADMINを配置していました。
任意のヒント?
この問題を解決する方法はたくさんあります。単純に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);
}
}
からインポートされたルーティング構成を見てください
ベンダー/friendsofsymfony/user-bundle/Resources/config/routing/all.xml
基本的なセキュリティアクションだけが必要な場合は、インポートするだけです
@ FOSUserBundle/Resources/config/routing/security.xml
の代わりに
@ FOSUserBundle/Resources/config/routing/all.xml
このようにして、使用するコンポーネント(セキュリティ、プロファイル、リセット、change_password)を選択するか、それらのコンポーネントから特定のルートのみをイベントインポートすることができます。
App/config /security.ymlを変更するだけです。
- { path: ^/register, role: ROLE_ADMIN }
デフォルト(IS_AUTHENTICATED_ANONYMOUSLY)からROLE_ADMINに変更すると、匿名ユーザーが/ registerフォームにアクセスできなくなります。
別の簡単な解決策(私が使用したもの)は 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)にリダイレクトするだけです。
JMSSecurityExtraBundleを使用する場合は、次のようにdenyAll
ディレクティブを使用できます。
- { path: ^/register, access: denyAll }
これが私がこの問題を解決する方法です...
まず、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')));
}
}
}
それが役に立てば幸い。
あなたはあなたの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');
}