FOSUser - 记住我功能问题

FOSUser - Remember me functionality issue

我用 symfony 2.8 建立了一个网站,我使用 FOSUserBundle 进行身份验证、用户管理等,我有一个问题可以解决。 对我来说没有明显的原因,"rememberme" cookie 不会像预期的那样运行。

我很确定我只是以某种方式遗漏了一个配置参数,但我找了几个小时都找不到它。

我在 apache 2.0 服务器上使用 php 7.0。

有我的 config.yml 文件(大部分):

framework:
    #esi:             ~
    translator:      { fallbacks: ["%locale%"] }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    #serializer:      { enable_annotations: true }
    templating:
        engines: ['twig']
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
        save_path: "%kernel.root_dir%/sessions/"
    fragments:       ~
    http_method_override: true

...

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: UserBundle\Entity\User

    from_email:
        address:        "%email_referer%"
        sender_name:    "App"
    group:
        group_class:    UserBundle\Entity\Group
        group_manager:  sonata.user.orm.group_manager
    resetting:
        email:
            template: :mail:resetting_password.html.twig
    service:
        mailer:         fos_user.mailer.twig_swift
        user_manager:   sonata.user.orm.user_manager

还有我的 security.yml :

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_CHAMPION:    [ROLE_USER]
        ROLE_ENTREPRISE:  [ROLE_USER]
        ROLE_ADMIN:       [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_A, ROLE_B]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
        SONATA:
            - ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT

    providers:
        fos_userbundle:
            id: fos_user.user_manager

    firewalls:
        admin:
            pattern: ^/admin
            context: user
            form_login:
                provider:               fos_userbundle
                login_path:             login
                use_forward:            true
                check_path:             sonata_user_admin_security_check
                failure_path:           null
                default_target_path:    sonata_admin_dashboard
            logout:
                path:               sonata_user_admin_security_logout
                target:             homepage
                invalidate_session: false
            anonymous:  true

        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            pattern: .*
            context: user
            form_login:
                provider:               fos_userbundle
                login_path:             login
                use_forward:            false
                check_path:             /login_check
                failure_path:           null
                csrf_token_generator:   security.csrf.token_manager
                default_target_path:    profile
            logout:
                path:               logout
                target:             homepage
                invalidate_session: false
            anonymous: true
            remember_me:
                secret:     '%secret%'
                lifetime:   15724800 # 6 months
                path:       /
                domain:     ~
                secure:     true

    access_control:
        # Some public pages
        - { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/cgu$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/cgv$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/contact$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/faq$, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # URL of FOSUserBundle which need to be available to anonymous users
        - { path: ^/connexion, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # Admin login page needs to be accessed without credential
        - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        # - { path: ^/admin/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }

        # Admin
        - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
        # Partie connectée
        - { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }

    acl:
        connection: default

编辑:

我做了一些测试,我的 REMEMBERME cookie 似乎没有被删除,它仍然在这里,开始日期和结束日期与以前相同。

所以,我可以关闭并打开我的浏览器,cookie 仍然在这里,当我这样做时,我仍然经过身份验证(并且可以转到管理员)。但是当我在 "idle" 停留一段时间并且我想访问管理部分时,我被重定向到登录页面。 REMEMBERME cookie 仍然存在,但此时,我无法访问我在启动浏览器时可以访问的页面。

编辑 2: 看来会话生命周期是我的问题的 "cause"。但我想要的是,当用户选中 "Remember me" 选项时,他不再需要再次登录,即使他在后台打开我网站的标签 x 天(就像移动浏览器那样)。我该怎么做?

编辑 2017 年 8 月 16 日: 我在 security.yml 文件中添加了一行: 域:~ 这条线似乎使系统正常工作。在我使用 Chrome 和 Firefox 的计算机上不再检测到该问题(如果这两个中的一个在玩我的 cookie)。

PS : 如果问题不再出现,我会在几天内更新这张票,到 "validate" 它。

我认为您谈论的是您的会话生命周期,而不是记住我的功能。

在您的 config.yml 中,您可以将框架配置为使用自定义会话生命周期。

framework:
     session:
         cookie_lifetime: 3600

如果未设置此配置,将使用您 php.ini 中的值。

希望对您有所帮助。

问题不再出现,解决方案似乎是"domain"参数:

domain:     ~