我的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
答案 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 - 我认为这里不需要第二个防火墙:)