记住我功能在 Symfony2 中不起作用
Posted
技术标签:
【中文标题】记住我功能在 Symfony2 中不起作用【英文标题】:Remember Me functionality not working in Symfony2 【发布时间】:2011-11-19 13:26:24 【问题描述】:我在 Symfony2 中实现了记住我的功能。当我选中记住我复选框登录时,会创建名为“REMEMBERME”的 cookie。如果我关闭浏览器并在数小时后打开它,该 cookie 也可用。但是当我加载我的应用程序的主页时,cookie 被自动删除,我看到没有用户登录。谁能解释我删除 cookie 的原因?
remember_me:
key: qwerty
lifetime: 604800
path: /
domain: ~
这是我的 security.yml 文件部分
编辑:我仍然没有找到这个问题的解决方案......
EDIT2:现在遇到了新问题。 REMEMBERME cookie 根本没有设置。这个怎么解决??
已解决:请参阅下面的答案
【问题讨论】:
可能重复:***.com/questions/6470994/… 【参考方案1】:尝试增加您的会话生命周期: (config.yml)
framework:
session:
default_locale: %locale%
auto_start: true
lifetime: 604800
【讨论】:
这不是添加记住我功能的方式......而且在浏览器关闭并重新打开后这也不起作用 这不是添加记住我功能的方法,但它适用于 cookie 会话的生命周期。使用我的配置,浏览器重新启动后会话仍然存在。抱歉,我不知道你的配置有什么不同。 这很糟糕,不要这样做。它不会扩展。 @bux “浏览器重启后会话仍然存在”。是的,但我们希望会话在浏览器重新启动后只有在选中记住我选项时才处于活动状态,并非总是如此。【参考方案2】:约翰。
我和你有同样的问题(或做过),我发现当我(Symfony2 实际上 =))在 101REMEMBERME cookie /strong> 在 /vendor/symfony/src/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeService.php 文件 $user->getPassword() 返回 NULL,因此 cookie 使用 NULL 密码值计算哈希值。
接下来发生的事情是,当您完全确信您将自动通过身份验证返回您的站点时,Symfony 开始在 与上述相同的文件但在 第 58 行检查您的 cookie 它发现 cookie hash 与 它期望的 不同 并抛出异常('The cookie\'s hash is invalid.')内部捕获它并在某处进行。
这就是为什么在我的情况下 cookie 不起作用的原因。
我还没有找到解决方案,但我会挖掘它,也许我很幸运。
希望您的问题是相同的,并且解决方案对我们双方都有帮助。
解决方案:
在实现声称用于从 UserInterface 擦除用户敏感数据的 eraseCredentials() 时,不要执行 $this->password = null。我犯了这个错误,因为我没有理解它的目的。您可以看一眼Symfony 2 Logout (UserInterface::eraseCredentials) 以获得一点解释。所以它序列化了令牌对象,我们遇到了麻烦。
【讨论】:
感谢您的回答,但我遇到了一个全新的问题。现在记住我 cookie 根本没有设置。 :-( 有什么想法吗?? 将用户名设置为 null 也会导致此问题。【参考方案3】:虽然这个问题已经得到解答,但我想提供一个可能的解决方案,如果只是为了这个问题的后代和谷歌搜索推荐:)
“问题很简单:被记住的用户没有 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]
【讨论】:
很高兴知道 IS_AUTHENTICATED_REMEMBERED 和 IS_AUTHENTICATED_FULLY 是互斥的。 看起来“/admin/”末尾的斜杠也很重要。IS_AUTHENTICATED_FULLY
和 IS_AUTHENTICATED_REMEMBERED
不需要加在一起,它们是一个层次结构 (FULLY > REMEMBERED > ANONYMOUSLY
)。在这种情况下,只需要IS_AUTHENTICATED_REMEMBERED
。【参考方案4】:
在我的情况下,这是我的 userProvider 的 supportsClass 方法的错误实现,这反过来又导致第 43 行的 TokenBasedRememberMeService 类出现异常(由 getUserProvider,并在其他地方被捕获,因此默默地失败)。 挖掘 Dmitry 显示的路径让我解决了这个问题。
【讨论】:
【参考方案5】:我遇到了这个问题,问题是我没有在 remember_me 部分 (security.yml) 的属性 key 中使用单引号。 改变这个:
记得我: 键:qwerty 寿命:604800 小路: / 域名:~到此:
记得我: 关键:'qwerty' 寿命:604800 小路: / 域名:~您可以在 symfony 文档中查看:http://symfony.com/doc/2.7/cookbook/security/remember_me.html
【讨论】:
【参考方案6】:在我的例子中,我实现了一个自定义登录处理程序,它根据文档返回一个RedirectResponse
。事实证明,这使得 Symfony 绕过标准登录例程,并导致 REMEMBERME
cookie 未被创建/存储。
我必须删除登录处理程序,实现一个包含所有需要逻辑的自定义登录侦听器。
你可以看到如何实现一个登录监听器here
【讨论】:
【参考方案7】:您还应该确保登录表单中的“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
【讨论】:
【参考方案8】:我有同样的问题。经过调查,我发现:
/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
【讨论】:
【参考方案9】:我使用的是 Symfony 4,我遇到了类似的问题,REMEMBERME
cookie 没有设置。
我的问题是我将 value=""
设置为输入类型复选框字段。
所以我改变了这个
<input type="checkbox" value="" id="remember_me" name="_remember_me">
到这里
<input type="checkbox" id="remember_me" name="_remember_me">
【讨论】:
【参考方案10】:在我的例子中,验证器被方法supportsRememberMe覆盖:
public function supportsRememberMe()
return true; // change it to true
【讨论】:
以上是关于记住我功能在 Symfony2 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
该功能在 UIViewControllerRepresentable 中不起作用