Symfony2 - 退出一个防火墙

时间:2013-06-16 03:00:15

标签: security authentication symfony firewall

我的Symfony2项目中有两个防火墙,“admin”和“client”。他们都使用相同的实体提供者。

我遇到的问题是,当我退出一个防火墙时,我也会退出另一个防火墙。我不希望这种情况发生。

我的实施或策略是否有问题。我确实想过拥有一个防火墙并通过用户角色管理对管理员和客户区的访问。但是,这并不能避免我上面描述的注销方案。

下面是我的security.yml(有点简化)。

    admin:
        pattern: ^/admin
        form_login:
            provider:      acme_userbundle
            login_path:    admin_login
            check_path:    admin_security_check
        logout:
            path:   admin_logout
            target: admin_login
        anonymous: false

    client:
        pattern: ^/client
        form_login:
            provider:      acme_userbundle
            login_path:    client_login
            check_path:    client_security_check
        logout:
            path:   client_logout
            target: client_login
        anonymous: false

3 个答案:

答案 0 :(得分:9)

解决方案

解决方案是添加以下配置行:

invalidate_session: false

(参考:http://symfony.com/doc/current/reference/configuration/security.html

该行应添加到每个防火墙的logout配置块中。这样,当您从其中一个注销时,会话将不会被销毁,您将继续登录其他会话。

实施例

security:
    ...
    firewalls:
        ...
        admin:
            pattern: ^/admin
            ...
            logout:
                path:   admin_logout
                ...
                invalidate_session: false #This line should do the trick!
            ...

         client:
             pattern: ^/client
             ...
             logout:
                 path:   client_logout
                 ...
                 invalidate_session: false #This line should do the trick!
             ...

答案 1 :(得分:1)

以下解决方案在Sf 2.0.x中运行,但我不确定它是否仍然有用......

登录时,会识别您的会话,并为每个防火墙创建一个安全条目,名为“security_”。因此,在您的情况下,要从客户区注销,您可以通过以下方式实现:

// $session is Session service from container
$session->remove('security_client');

答案 2 :(得分:0)

注销会清除会话中的安全上下文,因此您也会从第二个防火墙中注销。

您应该使用角色而不是两个不同的防火墙。

ROLE_ADMIN和ROLE_CLIENT - 我认为这里不需要第二个防火墙:)