所有子域的 Symfony2 会话

Posted

技术标签:

【中文标题】所有子域的 Symfony2 会话【英文标题】:Symfony2 session for all subdomains 【发布时间】:2015-07-01 23:57:27 【问题描述】:

我正在构建的网站每个用户都有一个子域。默认域是 www.acme.com,我自己的页面(例如)是 marcel.acme.com。另一个用户页面位于 johndoe.acme.com 下。现在发生以下情况: - www.acme.com 显示我已登录。 - marcel.acme.com 显示我已登录。 - johndoe.acme.com 显示我是匿名的。

在我的 config.yml 中我确实设置了

framework:session:cookie_domain: .acme.com

防火墙是为 ^/ 定义的,并使用 form_login (FosUserBundle) 和 oauth。两者的行为相同。

登录 www.acme.com 确实会重定向到 marcel.acme.com,所以这可能就是 marcel 和 www 都可以工作的原因,但我怎样才能让所有子域都工作?

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: /login
            check_path: /login_check 
        oauth:
            login_path: /login
            failure_path: /login
            check_path: /login
            use_forward: false
            default_target_path: /mytracker
            provider: fos_userbundle
            resource_owners:
                facebook: /login/check-facebook
            oauth_user_provider:
                service: my_user_provider
        anonymous:    true        
        logout:
            path: /logout
            target: /

Symfony 的版本是 2.6.5

【问题讨论】:

你能从你的security.yml 分享你的防火墙配置吗?另外,您使用的是哪个版本的 Symfony? 将答案添加到我原来的帖子中! 【参考方案1】:

看来我设法解决了。在我的配置中,我添加了:

session:
    cookie_lifetime: 0
    save_path: %kernel.root_dir%/var/sessions
    cookie_domain: .acme.com
    name: SFSESSID

此外,我还增加了安全性:

remember_me:
    key:      "%secret%"
    lifetime: 31536000
    path:     /
    domain:   .acme.com

应该不需要最后一部分,反正我想实现 remember_me 功能。感谢您的思考,也许有人对此有所帮助。

【讨论】:

对不起。我没能早点检查这个。我打算建议您设置会话name 参数,但即使这样我也不需要让它工作(我已经尝试过使用和不使用它)。此外,正如您所说,main 防火墙的remember_me 部分不应该是必需的。无论如何,很高兴你让它工作。 :)

以上是关于所有子域的 Symfony2 会话的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 子域防火墙在生产服务器上被忽略

Symfony2 监听器和会话

Symfony2 会话和缓存:清除命令

Symfony2 将实体对象序列化为会话

如何创建将在 Symfony2 中过期/销毁会话的命令控制台?

有没有办法阻止 Symfony2 为某些路径发送会话 cookie?