我如何在注销时删除 remember_me cookie?

How do I delete the remember_me cookie when I log out?

我目前正在使用 symfony 5.4,我想了解如何删除 REMEMBERME 服务器端

我正在尝试在 logout 下的 security.yaml 中设置 delete_cookies 参数:

        main:
            lazy: true
            provider: app_user_provider
            switch_user: true
            form_login:
                login_path: app_login
                check_path: app_login
            remember_me:
                secret: '%kernel.secret%'
                lifetime: 604800 # 1 week in seconds
                secure: true
            logout:
                path: app_logout
                delete_cookies:
                    REMEMBERME: { path: null, domain: null}

但是如果邮递员以同样的方式我通过只放置 REMEMBERME cookie 在受保护的路由中重做呼叫,即使没有登录,它也会向我显示受保护的路由......如果有人设法以这种方式拦截他们可以访问系统的任何已连接用户的 REMEMBERME ...

记住我 Cookie 有两种工作方式。参见 Symfony docs for token storage

  1. 基于签名的令牌 默认情况下,记住我的 cookie 包含基于用户属性的签名。如果属性发生变化,签名也会发生变化,并且已经生成的令牌不再被视为有效。

  2. 持久性令牌 持久性令牌存储任何生成的令牌(例如在数据库中)。这允许您通过更改数据库中的行来使令牌无效。

持久性令牌 可能更安全,因为您可以随时通过数据库使令牌失效。在您的情况下,您可以在注销时使令牌无效。

但是,您仍然可以使用 signature_properties 在您的 remember_me防火墙。

# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            # ...
            remember_me:
                secret: '%kernel.secret%'
                # ...
                signature_properties: ['password', 'updatedAt']

例如,您可以在用户实体中创建一个新字段,例如。 rememberMeKey 例如生成一个随机的 16 位代码。

bin2hex(random_bytes(8));

然后像这样将它添加到 signature_properties signature_properties: ['password', 'updatedAt', 'rememberMeKey']

现在,如果您想使它无效,您可以 re-generate 在您的用户实体中为该 属性 添加一个新代码,在您的情况下,当用户注销时。