【问题标题】:FOSUser - Remember me functionality issueFOSUser - 记住我功能问题
【发布时间】:2023-04-01 21:30:01
【问题描述】:

我用 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 仍然在这里,当我这样做时,我仍然是经过身份验证的(并且可以转到管理员)。但是,当我只是“闲置”一段时间并想访问管理部分时,我会被重定向到登录页面。 REMEMBERME cookie 仍然存在,但此时我无法访问启动浏览器时可以访问的页面。

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

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

PS : 如果问题不再出现,我会在几天后更新这张票,以“验证”它。

【问题讨论】:

    标签: php symfony cookies fosuserbundle


    【解决方案1】:

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

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

    framework:
         session:
             cookie_lifetime: 3600
    

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

    希望对你有帮助。

    【讨论】:

    • 我在这里的理解是,如果标签打开超过 3600 秒,用户将不得不再次登录。我想要的是当用户选中“记住我”选项时,他不再需要再次登录。我怎样才能做到这一点?
    【解决方案2】:

    问题不再出现,解决方案似乎是“域”参数:

    domain:     ~
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2012-08-08
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多