记住我在Symfony2中不起作用的功能

时间:2011-09-18 05:55:07

标签: symfony remember-me

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

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

这是我的security.yml文件部分

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

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

已解决:见下面的答案

10 个答案:

答案 0 :(得分: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] }

答案 1 :(得分:11)

约翰。

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

接下来发生的事情是,当您回到自己的网站时,您完全确信自动会自动进行身份验证,Symfony会开始在上面的相同的文件中检查您的Cookie ,但是在第58行它发现Cookie 哈希预期相同并抛出异常('Cookie的哈希值无效。')在内部捕获它并继续前进。

因此,在我的情况下,为什么cookie不起作用。

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

希望你的问题是一样的,解决方案对我们两个都有帮助。

解决方案:

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

答案 2 :(得分:1)

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

更改此

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

到此

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


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

答案 3 :(得分:0)

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

  framework:
    session:
        default_locale: %locale%
        auto_start:     true
        lifetime:       604800

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在我的情况下,我已经实现了一个自定义登录处理程序,它根据文档返回RedirectResponse。事实证明,这使得Symfony绕过标准登录例程,并导致REMEMBERME cookie未被创建/存储。

我必须删除Login Handler,实现一个包含所有必需逻辑的自定义Login Listener。

您可以看到如何实现Login Listener here

答案 6 :(得分:0)

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

正确

<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

答案 7 :(得分: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

答案 8 :(得分:0)

我正在使用Symfony 4,但遇到类似的问题,未设置REMEMBERME cookie。

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

所以我改变了

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

对此

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

答案 9 :(得分:0)

在我的情况下,authenticator被supportsRememberMe方法覆盖:

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