Symfony FOSUserBundle 记住我不起作用

Symfony FOSUserBundle Remeber me doesn't work

我正在使用 FOSUserBundle 并将电子邮件作为用户名。

尝试使用 remember_me 功能,但它不起作用。我读过这个 Symfony2: "Remember me" tries to authenticate by username instad of email

这是一篇很旧的文章,数据库中的用户名字段设置为与电子邮件相同的值,所以我不明白为什么它不起作用。

正在与 Google Chrome Inspector 检查是否设置了 REMEMBERME cookie...

有人可以帮忙吗?

这是我的security.yaml

providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager
            logout:       true
            anonymous:    true
            remember_me:
                secret:   '%secret%'
                lifetime: 604800 # 1 week in seconds
                path:     /
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

    access_control:
        - { path: ^/$, role: IS_AUTHENTICATED_FULLY }
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account/*, role: IS_AUTHENTICATED_FULLY }
        - { path: ^/admin/*, role: ROLE_ADMIN }

好的,这是一个 角色 配置问题。

根据 documentation:

  • IS_AUTHENTICATED_ANONYMOUSLY:所有用户(甚至匿名用户)都有这个

  • IS_AUTHENTICATED_REMEMBERED:所有登录用户都有这个,即使他们是因为"remember me cookie"登录的。即使你 不要使用记住我的功能,您可以使用它来检查是否 用户已登录。

  • IS_AUTHENTICATED_FULLY:类似于IS_AUTHENTICATED_REMEMBERED,但更强。登录用户
    只因一个"remember me cookie"会有
    IS_AUTHENTICATED_REMEMBERED 但不会有 IS_AUTHENTICATED_FULLY.

因此,在我的 security.yml 中,关闭浏览器后尝试访问路径“^/$”和“^/account/*”是不可能的,因为 IS_AUTHENTICATED_FULLY请求.

我改成了这个

access_control:
        - { path: ^/$, roles: IS_AUTHENTICATED_REMEMBERED }
        - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account/*, roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/admin/*, roles: [IS_AUTHENTICATED_FULLY, ROLE_ADMIN] }

现在我可以使用 REMEMBERME cookie 访问“^/$”路径,但不能访问限制性更强的“^/account/”和“^/admin/”因为敏感数据(这正是我想要的)。