这可能是一个糟糕的方法问题而不是技术问题,但无论如何您的建议非常有价值。
我的网站有两个受保护的页面,/home和/popup,每个页面都需要登录用户。您可能知道 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标志,如果它为真,我只返回弹出模板,如果不是,我返回普通模板。
到目前为止,一切都很好并且可以正常工作(经过测试)。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 只是登录我网站的两种不同方式。