0

これは、技術的な問題というよりも、アプローチの問題かもしれませんが、いずれにせよ、あなたの提案は非常に価値があります。

私の Web サイトには/home/popupという 2 つの保護されたページがあり、各ページにはログイン ユーザーが必要です。ご存知かもしれませんが、Symfony はログインしていないユーザーを自動的に login_path (私の場合は/login ) にリダイレクトするので、問題ありません。問題は、URL /homeからログインしようとするユーザーは、テンプレート呼び出しnormal_login.html.phpを確認する必要があり、 /popupを使用してログインしようとするユーザーは popup_login.html.php を確認することです。

私の/loginページはユーザーコントローラーによって管理されています。ユーザーが/popupから来たかどうかを確認するためにヘッダーリファラーをチェックしているだけです:

    $previousUrl = $this->getRequest()->headers->get('referer'); 
    if(strpos($previousUrl, $this->generateUrl('done_punctis_popup'))) $popupref = true;

スクリプトが終了したら、popuprefフラグを確認し、true の場合はポップアップ テンプレートを返し、そうでない場合は通常のテンプレートを返します。

これまでのところ、すべて非常に良好で機能しています (テスト済み)。次に、Symfony フレームワークは、任意のテンプレートからのフォーム送信を処理し、ユーザーをログインさせて、元の意図された保護されたページ/homeまたは/popupにリダイレクトします。

あなたが尋ねるかもしれない障害はどこですか?システムはリファラー値に基づいているため、ユーザーがログイン フォームを間違えなければすべて問題ありませんが、入力情報が正しくない場合 (パスワードまたはユーザー名が間違っている場合)、check_login スクリプトはユーザーを次の場所にリダイレクトします。今回のログインコントローラーのみの問題は、リファラーが/homeまたは/popupではなく、/login_check !! そのため、コントローラーはユーザーの出身地がわからないため、テンプレートがどこに返されるかわかりません。


どう思いますか?

編集 (要求)

コントローラ

public function loginAction( )
{
    $popupref = false;
    $previousUrl = $this->getRequest()->headers->get('referer'); 
    if(strpos($previousUrl, $this->generateUrl('done_punctis_popup'))) $popupref = true;

    // Se è già loggato non deve vedere questa pagina quindi redirect
    if( $this->get('security.context')->isGranted('ROLE_USER') && !$popupref)
        return $this->redirect( $this->generateUrl('done_punctis_user_homepage'));


    $request = $this->getRequest();
    $session = $request->getSession();

    // verifica di eventuali errori
    if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
        $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    } else {
        $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
        $session->remove(SecurityContext::AUTHENTICATION_ERROR);
    }

    if(!$popupref) {
        return $this->render('DonePunctisBundle:Pages:login.html.php', array(
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error
            ));
    } else {
        return $this->render('DonePunctisBundle:Popup:popupSignup.html.php', array(
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error
           ));
    }

}

安全

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        remember_me:
            key: %secret%
            lifetime: 3600
            path: /
            domain: ~
        pattern: ^/
        anonymous: ~
        form_login:
            login_path: /login
            check_path: /login_check
        logout:
            path:   /logout
            target: /

質問では、より明確な説明を得るためにいくつかの名前を変更しましたが、/home は実際には存在しません。実際には、承認が必要な呼び出しはすべて通常のテンプレートを使用し、/popup からの呼び出しだけでポップアップ テンプレートが必要です。

PS。/home または /popup のユーザーは同じです。/home と /popup は、私のサイトにログインするための 2 つの異なる方法です。

4

0 に答える 0