如何重定向记住的用户?

时间:2013-07-12 09:07:43

标签: redirect symfony login remember-me

我正在使用symfony 2.2开发一个网站。我使用FOSUserBundle,我的网站基本上由主页,登录页面,注册页面和安全区域组成。

我想要做的是当用户输入我网站的地址时:

  • 如果匿名 - >转到主页

  • 如果被记住 - >去安全区域

我尝试过两种不起作用的东西。

1)如果我将我的网址 / 放入安全区域,我会将重定向正确地发送到login_path。但是当在security.yml中选择我的login_path时,我遇到了一个问题:

  • 如果我将 / login ,匿名重定向到登录而不是主页

  • 如果我将 / homepage ,匿名重定向到主页,但如果在登录表单中输入错误凭据,则会将其重定向到主页,而不是在 /中看到错误消息登录

2)如果我将我的网址 / 提供给我的主页和login_path = / login 对应的匿名用户,那么除了记住之外用户也可以访问主页而不是安全区域。

在最后一种情况下,如果我发现它们被记住了,我会尝试将它们重定向到安全区域,但是我在论坛中找到的2个代码并且我在我的控制器中尝试了... ...

public function indexAction()
    {
        $securityContext = $this->container->get('security.context');
        $user = $securityContext->getToken()->getUser();
        if (is_object($user) && $user instanceof UserInterface ) {
            return $this->redirect($this->generateUrl('tk_user_homepage'));
        }else if( $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') ){
            return $this->redirect($this->generateUrl('tk_user_homepage'));
        }else{
            return $this->render('TkWelcomeBundle:Default:index.html.twig');
        }
    }

当我回到我的网站上时,我将$ user视为非对象而第二个语句为false。但是我可以通过网址访问安全区域。

这样做的正确方法是什么(1或2)以及我在每种情况下缺少什么?

修改

其实我做了这个测试:

来回主页前往安全区域并测试用户是否__ granted:

'role_user','is_authenticated_anonimously','is_authenticated_remembered'和'is_authenticated_fully'

在安全区域我得到了我期望的(1,0,1,1)但是当我去主页它是(0,0,0,0)并且我可以回到安全区域并检索(1 ,0,1,1)。

所以我猜我的主页上没有安全上下文。有人对此有暗示吗?

提前谢谢你, 朱尔斯

1 个答案:

答案 0 :(得分:0)

这似乎有效:

我需要在防火墙下设置URL,以便用户可以访问用户。所以我把所有网站都放在安全区域,匿名授权并使用访问控制:访问主页/登录/注册匿名,然后我只允许记住用户访问整个网站。

这是我的security.yml

firewalls:
    secured_area:
        pattern: ^/
        anonymous: ~
        form_login:
            login_path: /login
            check_path: /login_check
            default_target_path: tk_user_homepage
            provider: fos_userbundle
            remember_me: true
            csrf_provider: form.csrf_provider
        remember_me:
            key: %secret%
        logout:
            path:   fos_user_security_logout
            target: fos_user_security_login

access_control:
    - { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
    - { path: ^/admin/, role: ROLE_ADMIN }

我希望这会有所帮助。