Symfony2防火墙:让用户通过子域进行登录

时间:2014-06-12 08:32:05

标签: php symfony firewall

我为我的客户创建了3个工具。每个客户都必须访问一个,两个或三个工具,具体取决于他支付的费用。

我现在正尝试将这3个工具连接到同一个UserBundle。每个工具都有自己的子域名:tool1.mysite.com; tool2.mysite.comtool3.mysite.com

我定义了3个角色,每个工具1个。我只保留了一个防火墙,主要来自FOSUserBundle,在主机.mysite.com上定义,以覆盖所有子域。

我的问题是:我可以在任何子域中使用登录页面,但似乎已记录的用户仅保留在他记录的子域中。如果我登录像#34; User1" on" Tool1"我不会登录Tool2。如果我在Tool2上以User2身份登录,我仍然会像#34; User1" on" Tool1"。

我不知道如何改变这种行为?

非常感谢你!

我的security.yml如下:

    firewalls:
        main:
            pattern: ^/
            host: .mysite.com
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:
                path: /logout
                target: /login
            anonymous:    true

access_control:
    - { host: .mysite.com, path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { host: .mysite.com, path: ^/admin/, role: ROLE_ADMIN }
    - { host: .mysite.com, path: ^/register, role: ROLE_ADMIN }
    - { host: .mysite.com, path: ^/resetting, role: ROLE_ADMIN }
    - { host: tool1.mysite.com, path: ^/tool1, role: ROLE_TOOL1 }
    - { host: tool2.mysite.com, path: ^/tool2, role: ROLE_TOOL2 }
    - { host: tool3.cospirit.com, path: ^/tool3, role: ROLE_TOOL3 }

role_hierarchy:
    ROLE_TOOL1:  [ROLE_USER]
    ROLE_TOOL2:  [ROLE_USER]
    ROLE_TOOL3:  [ROLE_USER]

2 个答案:

答案 0 :(得分:4)

config.yml文件中添加它似乎更有效:

framework:
    session:
        name: SFSESSIDCSMT
        cookie_domain: .mysite.com

我不知道哪种解决方案更好?

答案 1 :(得分:1)

因为它有不同的子域名,并且symfony将登录数据存储在cookie中,所以每个子域名都有单独的数据。 我建议你创建3个防火墙,并在其中添加上下文密钥,只需添加一个公共值。

firewalls:
        main:
            pattern: ^/
            host: main.mysite.com
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:
                path: /logout
                target: /login
            anonymous:    true
            context: main_context
        second:
            pattern: ^/
            host: first.mysite.com
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:
                path: /logout
                target: /login
            anonymous:    true
            context: main_context

为了实现这一点,也许您还需要更改symfony的cookie设置,但我会先尝试这个解决方案。