Symfony模拟用户和多个防火墙

时间:2017-04-23 13:53:03

标签: php symfony impersonation

我对symfony的功能有疑问。当我冒充用户并且我打电话给我的API时,用户不是模仿者。

这是我的安全配置:

api:
    pattern:   ^/api/.*
    provider: fos_userbundle
    guard:
        authenticators:
            - app.wsse_authenticator
            - app.form_login_authenticator
        entry_point: app.wsse_authenticator
    logout:       true
    stateless: true
    anonymous:    true
    switch_user: true
    context: my_context
main:
    pattern:   ^/.*
    provider: fos_userbundle
    guard:
        authenticators:
            - app.form_login_authenticator
    switch_user: true
    logout:       true
    anonymous:    true
    remember_me:
        secret:      "%secret%"
        lifetime: 7200 # in seconds (=12h)
        always_remember_me: true
    context: my_context

我尝试使用相同的上下文在两个防火墙之间共享模拟用户,但它无法正常工作。

当使用/test模拟用户的请求时,但是当我在/api/test上发出请求时,用户就是我,而不是模仿者。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

我相信你所做的事情不会像你想要的那样发挥作用。

API防火墙为stateless,这意味着身份验证中没有session。通常使用REST API,您可以通过设置TOKEN或作为请求的一部分header向您发送http://localhost/api/users?apiKey=my_key_goes_here,这是您进行身份验证的方式。

另一方面,在main防火墙中,身份验证是通过会话完成的。身份验证凭据(即UserToken)存储在a session中,然后每次用户向您网站的网址发出请求时都会使用这些凭据。

如果两个context都基于firewalls,那么session就会有效。在这种特殊情况下,身份验证方法完全不兼容,这就是为什么您只需点击Symfony development tool barimpersonate其他用户。

packagist中进行简单搜索我找到了SwitchUserStatelessBundle,这可能是您正在寻找的内容。