Symfony 4记住我不使用用户名工作

问题描述 投票:0回答:1

我们如何配置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”.

php symfony doctrine-orm fosuserbundle symfony4
1个回答
1
投票

安全组件使用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
© www.soinside.com 2019 - 2024. All rights reserved.