记住我的功能不在Symfony2中工作

记住我的功能不在Symfony2中工作,symfony,remember-me,Symfony,Remember Me,我已经在Symfony2中实现了记忆我的功能。当我选中“记住我”框登录时,将创建名为“REMEMBERME”的cookie。如果我关闭浏览器并在数小时后打开它,该cookie也可用。但当我加载应用程序的主页时,cookie会自动删除,并且我没有看到任何用户登录。谁能解释一下删除cookie的原因吗 remember_me: key: qwerty lifetime: 604800 path: / d

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

remember_me:
          key:      qwerty
          lifetime: 604800
          path:     /
          domain:   ~ 
这是我的security.yml文件部分

编辑:我还没有找到这个问题的答案

编辑2:现在有了新问题。Memberme cookie根本没有设置。如何解决这个问题


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

尝试延长会话寿命: (config.yml)

约翰

我的问题与您(或曾经)的问题相同,我发现当我(实际上是Symfony2=)在101上设置REMEMBERMEcookie时,/vendor/symfony/src/symfony/Component/Security/Http/REMEMBERME/tokenbasedrembermeservice.php文件$user->getPassword()返回NULL,因此cookie使用NULL密码值计算哈希值

接下来发生的事情是,当您返回您的站点时,完全相信您将自动通过身份验证,Symfony开始在与上述文件相同的文件中检查cookie,但在第58行上,它发现cookie哈希与它期望的不一致,并抛出异常(“cookie的哈希无效”)。它会在内部捕获它并在某个地方继续

这就是为什么在我的例子中cookie不起作用的原因

我还没有找到解决办法,但我会努力寻找,也许我很幸运

希望您的问题是相同的,解决方案将有助于我们双方

解决方案:


当实现声称用于从UserInterface擦除用户敏感数据的橡皮擦凭据()时,不要执行$this->password=null。我犯了这个错误,因为我不明白它的目的。你可以浏览一下,了解一些解释。因此,它序列化了令牌对象,我们遇到了麻烦。

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

“问题很简单:记住使用的用户没有“完全验证”角色,而只有“已验证”角色被记住,以区别记住的用户和登录的用户”

资料来源:

这意味着,在安全配置中,您必须确保对于每个ACL条目,除了配置“完全验证”角色外,还配置了“已验证”角色

例如:

#app/config/security.yml
security:
    ...
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }

在我的例子中,这是我的userProvider的supportsClass方法的错误实现,这反过来导致第43行的TokenBasedRememberMeService类中出现异常(由getUserProvider抛出,并在别处捕获,因此默默失败)。
挖掘Dmitry显示的路径使我解决了这个问题。

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

更改此设置

remember_me: key: qwerty lifetime: 604800 path: / domain: ~ remember_me: key: 'qwerty' lifetime: 604800 path: / domain: ~
<input type="checkbox" id="remember_me" name="_remember_me" />
<input type="checkbox" id="remember_me" name="_remember_me" value="" />
记住我: 钥匙:qwerty 寿命:604800 路径:/ 域:~ 对此

remember_me: key: qwerty lifetime: 604800 path: / domain: ~ remember_me: key: 'qwerty' lifetime: 604800 path: / domain: ~
<input type="checkbox" id="remember_me" name="_remember_me" />
<input type="checkbox" id="remember_me" name="_remember_me" value="" />
记住我: 钥匙:“qwerty” 寿命:604800 路径:/ 域:~

您可以在symfony文档中查看它:

在我的例子中,我实现了一个自定义登录处理程序,该处理程序根据文档返回一个
重定向响应。事实证明,这使得Symfony绕过了标准登录例程,并导致未创建/存储
REMEMBERME
cookie

我必须删除登录处理程序,实现一个带有所有必要逻辑的自定义登录侦听器


您可以看到如何实现登录侦听器。您还应该确保登录表单中的“记住我”输入没有值属性:

这是正确的

remember_me: key: qwerty lifetime: 604800 path: / domain: ~ remember_me: key: 'qwerty' lifetime: 604800 path: / domain: ~
<input type="checkbox" id="remember_me" name="_remember_me" />
<input type="checkbox" id="remember_me" name="_remember_me" value="" />

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

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

providers:
    user_provider:
        entity:
            class: App\Entity\User
            property: email

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

我的问题是在输入类型复选框字段中设置了一个
value=“

所以我改变了

对此


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

public function supportsRememberMe()
{
    return true; // change it to true
}

可能重复:这不是添加“记住我”功能的方法。。。。在浏览器关闭并重新打开后,这也不起作用。这不是添加“记住我”功能的方法,但它适用于cookies会话生命周期。在我的配置中,会话在浏览器重新启动后处于活动状态。对不起,我不知道你的配置有什么不同。这很糟糕,不要这样做。它无法缩放。@bux“重新启动浏览器后会话处于活动状态”。是的,但我们希望会话在浏览器重新启动后处于活动状态,前提是选中了“记住我”选项,而不是始终选中。谢谢您的回答,但我遇到了一个全新的问题。现在请记住,cookie一点也没有设置好-(任何想法??将用户名设置为null也会导致此问题。很高兴知道“已验证”和“已完全验证”是互斥的。看起来“/admin/”结尾的尾随斜杠也很重要。