0

这可能是一个糟糕的方法问题而不是技术问题,但无论如何您的建议非常有价值。

我的网站有两个受保护的页面,/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 只是登录我网站的两种不同方式。

4

0 回答 0