13

我在 Symfony2 中实现了记住我的功能。当我选中记住我复选框登录时,会创建名为“REMEMBERME”的 cookie。如果我关闭浏览器并在数小时后打开它,该 cookie 也可用。但是当我加载我的应用程序的主页时,cookie 被自动删除,我看到没有用户登录。谁能解释我删除 cookie 的原因?

remember_me:
          key:      qwerty
          lifetime: 604800
          path:     /
          domain:   ~ 

这是我的 security.yml 文件部分

编辑:我仍然没有找到这个问题的解决方案......

EDIT2:现在有新问题。REMEMBERME cookie 根本没有设置。这个怎么解决??

已解决:请参阅下面的答案

4

10 回答 10

13

虽然这个问题已经得到解答,但我想提供一个可能的解决方案,如果只是为了这个问题的后代和谷歌搜索推荐:)

“问题很简单:记住的用户没有 IS_AUTHENTICATED_FULLY 角色,而只有 IS_AUTHENTICATED_REMEMBERED 才能区分记住的用户和登录的用户”

来源: http: //www.mail-archive.com/symfony-users@googlegroups.com/msg34021.html

这意味着在您的安全配置中,您必须确保除了 IS_AUTHENTICATED_FULLY 角色之外,还为每个 ACL 条目配置了 IS_AUTHENTICATED_REMEMBERED 角色。

例如:

#app/config/security.yml
security:
    ...
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }
于 2012-06-11T19:39:11.343 回答
11

约翰。

我和你有同样的问题(或做过),我发现当我(Symfony2 实际上 =))在/vendor/symfony/src/Symfony/Component/Security/的第101行设置REMEMBERME cookie Http/RememberMe/TokenBasedRememberMeService.php文件$user->getPassword()返回NULL,因此 cookie 使用 NULL 密码值计算哈希值。

接下来发生的事情是,当您完全确信您将自动通过身份验证返回您的站点时,Symfony 开始在与上述相同的文件中检查您的 cookie,但在第 58 行它发现 cookie哈希与预期的不一样,并且抛出异常('The cookie\'s hash is invalid.')在内部捕获它并在某处继续。

这就是为什么在我的情况下cookie不起作用的原因。

我还没有找到解决方案,但我会挖掘它,也许我很幸运。

希望您的问题是相同的,并且解决方案将对我们双方都有帮助。

解决方案:

在实现声称用于从 UserInterface 擦除用户敏感数据的 eraseCredentials() 时,不要执行 $this->password = null。我犯了这个错误,因为我没有理解它的目的。你可以看一下Symfony 2 Logout (UserInterface::eraseCredentials)以获得一点解释。所以它序列化了令牌对象,我们遇到了麻烦。

于 2012-02-11T11:28:58.800 回答
1

我遇到了这个问题,问题是我没有在remember_me部分(security.yml) 的属性中使用单引号。改变这个

记住账号:
    键:qwerty
    寿命:604800
    小路: /
    域名:~

对此

记住账号:
    关键:'qwerty'
    寿命:604800
    小路: /
    域名:~


您可以在 symfony 文档中查看它:http:
//symfony.com/doc/2.7/cookbook/security/remember_me.html

于 2016-02-26T15:14:34.273 回答
0

尝试增加您的会话生命周期:(config.yml)

  framework:
    session:
        default_locale: %locale%
        auto_start:     true
        lifetime:       604800
于 2012-01-15T12:51:57.710 回答
0

在我的情况下,这是我的userProvider的 supportsClass 方法的错误实现,这反过来导致第 43 行的TokenBasedRememberMeService类中出现异常(由getUserProvider抛出,并在其他地方捕获,因此无声地失败)。挖掘 Dmitry 显示的路径让我解决了这个问题。

于 2013-08-29T23:47:53.407 回答
0

就我而言,我已经实现了一个自定义登录处理程序,它RedirectResponse根据文档返回一个。事实证明,这使得 Symfony 绕过标准登录例程,并导致REMEMBERMEcookie 没有被创建/存储。

我必须删除登录处理程序,使用所有需要的逻辑实现自定义登录侦听器。

您可以在此处查看如何实现登录侦听器

于 2017-01-09T08:31:42.203 回答
0

您还应该确保登录表单中的“remember_me”输入没有value属性:

这是正确的:

<input type="checkbox" id="remember_me" name="_remember_me" />

但这不起作用

<input type="checkbox" id="remember_me" name="_remember_me" value="" />

如果您使用 form_login,还要检查 security.yml 中是否启用了 remember_me:

firewalls:
    main:
        form_login:
            # ...
            remember_me: true
于 2017-01-10T10:34:50.910 回答
0

我遇到过同样的问题。经过调查,我发现: /vendor/symfony/doctrine-bridge/Security/User/EntityUserProvider.php::loadUserByUsername()需要property在您的实体用户提供程序上设置字段,或者您的存储库实现Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface并具有方法loadUserByUsername()

我刚刚添加了属性字段,如下所示:

providers:
    user_provider:
        entity:
            class: App\Entity\User
            property: email
于 2018-04-27T07:12:12.903 回答
0

我正在使用 Symfony 4,我遇到了类似的问题,REMEMBERMEcookie 没有设置。

我的问题是我value=""设置了输入类型复选框字段。

所以我改变了这个

<input type="checkbox" value="" id="remember_me" name="_remember_me">

对此

<input type="checkbox" id="remember_me" name="_remember_me">

于 2018-08-06T13:25:48.427 回答
0

在我的例子中,验证器被方法supportsRememberMe覆盖:

public function supportsRememberMe()
{
    return true; // change it to true
}
于 2019-01-04T13:37:33.363 回答