0

ユーザーがログインしておらず (FOSUser および SonataAdmin で動作)、http://domain.com/app_dev.php(dev) またはhttp://domain.com(prod) のいずれかを呼び出す場合にリダイレクトしようとしています。両方の場合にリダイレクトしたい/loginので、次の場所にこの構成を書きましたapp/routing.yml:

root:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /login
        permanent: true

それは機能しますが、コントローラーにこれがあるため、問題があります。

/**
 * @param Request $request
 *
 * @return array
 * @Route("/", name="brand")
 * @Method("GET")
 * @Template()
 */
public function indexAction(Request $request)
{
    ....
}

次に、例のように(dev) または(prod)brandのようなリンクを使用してルートを呼び出そうとすると、にリダイレクトされました。私の最善のアイデアは、コードを次のように変更することです。http://domain.com/app_dev.php/?email=7x-xRFClkjwhttp://domain.com/?email=7x-xRFClkjw/login

/**
 * @param Request $request
 *
 * @return array
 * @Route("/bp", name="brand")
 * @Method("GET")
 * @Template()
 */
public function indexAction(Request $request)
{
    ....
}

そして、その機能の代わりに新しいルートを使用してリダイレクトします(これは主に、ユーザーが以前に共有されたリンクを含む大量の電子メールをすでに持っているためであり、それを変更することはできません)。しかし、私がこれを書いた場合、私はこのルールをどのように書き込めばよいかわかりません:/bp/routing.yml

bp:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: brand
        permanent: true

リダイレクトループになってしまいます。/loginまた、適切なドキュメントが見つからないため、デフォルト ルートの設定方法を変更することもできます。この投稿の背後にある大きなアイデアは、 のデフォルト ルートを設定することです/。これについて何か助けてもらえますか?

追加情報として、これは私のsecurity.ymlファイルの一部です:

firewalls:
    ...

    admin_area:
        pattern: ^/
        anonymous: ~
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider

            # the user is redirected here when they need to log in
            login_path: /login

            # submit the login form here
            check_path: /login_check

            # login success redirecting options (read further below)
            always_use_default_target_path: true
            default_target_path: /admin/dashboard
            target_path_parameter: _target_path
            use_referer: false
            failure_path: /admin/dashboard
            failure_forward: false
        logout:
            path:   /logout

アップデート

実際、@emmanuel-hdz-díaz のコードは別のアイデアを与えてくれます。コントローラーでこれを行うだけで、カーネル リスナーを作成したり、多くのコードを追加したりする必要はありません。

if ($request->query->get('email')) {
    ...
} else {
    return $this->redirect($this->generateUrl('sonata_user_admin_security_login'));
}

ユーザーを/loginルートにリダイレクトできました。

4

3 に答える 3

1

よくわかりませんが、サイト全体へのアクセスを制限しますか? その場合、セキュリティ設定を変更するだけで、ログインにリダイレクトを追加しないでください。使用がログインしていても、常にログインにリダイレクトされるためです。簡単な構成例を次に示します。

security:
    firewalls:
        main:
            pattern: ^/
            anonymous: true

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: ROLE_USER }
于 2015-08-29T16:52:19.220 に答える
1

特別な例外をスローし、kernel.request イベントでキャッチし、そこからリダイレクトします。ルートを保存できるカスタム例外を作成する必要があります。例:

class RouteException extends \Exception{
    protected $route;

     public function __construct($route){
         $this->route = $route;
    }

    public function getRoute() { return $this->route; }
}

RedirectResponse次に、この例外を検出したときにを生成するリスナーを作成します。

class RedirectExceptionListener{
  protected $router;

  public function __construct(RouterInterface $router){
    $this->router;
  }

  public function onException(GetResponseForExceptionEvent $event){

    $e = $event->getException();

    if($e instanceof RouteException){

      $url = $this->router->generate($e->getRoute());

      $event->setResponse(
        new RedirectResponse($url);
      );
    }
  }
}

# the service definition
your_listener:
    class: RedirectExceptionListener
    arguments:
        - @router
    tags:
        - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

:use使用するクラスの名前空間を確認する必要があります。
これは基本的に、アプリケーションのどこからでもリダイレクトするためにできることですが、例外の悪臭の使用のように思えます。そのため、例外をスローRedirecterするメソッドを含むサービスを作成しredirect($route)て、呼び出し元のサービスがリダイレクトの方法を認識しないようにします。例外Redirecterをスローするか、指定されたルートにリダイレクトするために必要なことを実行できます。
イベント リスナーの詳細については、「イベントリスナー」を参照してください。

更新login_path: これは、認証されていないときにsymfony がユーザーをリダイレクトする方法とまったく同じです。ExceptionListenerを参照してください。

于 2015-09-01T05:32:10.590 に答える