我已经实现了在Symfony2中记住我的功能。当我使用“记住我”框登录时,会创建名为“REMEMBERME”的cookie。如果我关闭浏览器并在数小时后打开它,那么该cookie也可用。但是当我加载我的应用程序的主页时,cookie会自动删除,我看不到用户登录。有人可以解释我删除cookie的原因吗?
remember_me:
key: qwerty
lifetime: 604800
path: /
domain: ~
这是我的security.yml文件部分
编辑:我还没有找到这个问题的解决方案...EDIT2:现在遇到了新问题。 REMEMBERME cookie根本没有设置。怎么解决这个?
已解决:见下面的答案
答案 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
}