これは、技術的な問題というよりも、アプローチの問題かもしれませんが、いずれにせよ、あなたの提案は非常に価値があります。
私の 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 つの異なる方法です。