我们如何配置Symfony 4在创建cookie并将其存储在浏览器中时,请记住我使用电子邮件而不是用户名(默认设置)的功能?
我的问题是通过使用电子邮件在S4中进行身份验证,cookie是使用用户名而不是其哈希中的电子邮件创建的,存储在浏览器中但是当S4检查我的cookie以查看IS_AUTHENTICATED_REMEMBERED
是否为true时,它会根据用户名进行检查存储在不会产生感觉的DB中。它应该根据电子邮件进行检查。所以我记得我的功能不起作用。如果我使用用户名登录,那么它可以工作,但这不是我想要的,我希望我的用户使用他们的电子邮件地址登录。
我已经将登录配置为使用电子邮件而不是默认的用户名行为,但我不记得我以这种方式工作。
我在我的security.yaml
尝试了以下内容
security:
encoders:
App\Entity\User:
algorithm: bcrypt
providers:
user_provider:
entity:
class: App\Entity\User
property: email
in_memory: { memory: ~ }
our_db_provider:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
http_basic: ~
provider: our_db_provider
anonymous: ~
form_login:
login_path: login
check_path: login
default_target_path: dashboard
username_parameter: email
password_parameter: password
remember_me: true
remember_me:
secret: '%kernel.secret%'
lifetime: 31536000 # 1 week in seconds
path: /
domain: ~
secure: true
name: REMEMBERME
remember_me_parameter: remember_me
always_remember_me: true
logout:
path: /logout
target: /
但是这不会让你参数记住用于生成存储在cookie中的哈希的字段。
如果您已设法设置登录/身份验证并记住我使用的字段不同于用户名,请分享:)
更新:我试过艾哈迈德回答服务的以下几行,但它不起作用:
App\Security\TokenBasedRememberMeServices:
decorates: Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices
它说You have requested a non-existent service "Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices”.
安全组件使用getUsername()
getter构建令牌https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php#L74的问题
所以我们需要覆盖负责创建记住我的cookie的服务,希望是qazxsw poi。
Firstable:更新security.authentication.rememberme.services.simplehash.class
方法onLoginSuccess
,因此它使用电子邮件而不是用户名。
L74
第二:将您的课程注册为服务。
namespace App\Security;
...
class TokenBasedRememberMeServices extends AbstractRememberMeServices
{
....
protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token)
{
...
$value = $this->generateCookieValue(\get_class($user), $user->getEmail(), $expires, $user->getPassword());
...
}
...
或者您可以在 App\Security\TokenBasedRememberMeServices:
decorates: 'security.authentication.rememberme.services.simplehash.class'
下流动合同它定义并返回用于验证用户身份的用户名。在我们的例子中,它是 UserInterface财产。
email