5

我的 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
4

2 回答 2

10

解决方案

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

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!
             ...
于 2014-02-14T04:36:10.437 回答
1

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

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

// $session is Session service from container
$session->remove('security_client');
于 2013-06-17T08:15:17.050 回答