【问题标题】:Symfony3.2 to symfony4 security.encoder_factory deprecated errorSymfony3.2 到 symfony4 security.encoder_factory 已弃用错误
【发布时间】:2018-11-15 06:59:27
【问题描述】:

我通过创建新的 symfony4 框架并将源代码从 symfony3.2 移动到 symfony4,将我的网站从 Symfony 3.2 更新到了 Symfony 4。

我已经进行了Upgrading Symfony4中提到的更改。我还安装了所有必需的包。现在我可以进行路由并成功地将我的网页显示在显示器上,我面临的问题是登录表单没有工作。

在我的 symfony3.2 版本的登录控制器中,

我使用了 security.encoder_factory 服务

当我在 symfony4 中运行它时,结果是:

The "security.encoder_factory" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.

我的控制器密码编码是:

public function loginAction(Request $request)
{
    #$defaultEncoder = new MessageDigestPasswordEncoder('bcrypt', true, 5000);
    $defaultEncoder = new MessageDigestPasswordEncoder('bcrypt');

    $encoders = [
        User::class => $defaultEncoder, // Your user class. This line specify you ant sha512 encoder for this user class
        ];

    $encoderFactory = new EncoderFactory($encoders);

    $data = [
        'error' => null,
        '_username' => null,
    ];
    if ($request->isMethod('POST')) {
        $_username = $request->request->get('_username');
        $_password = $request->request->get('_password');

        $data['_username'] = $_username;
        $user = $this->getDoctrine()->getManager()
            ->getRepository("App:User")
            ->findOneBy(array('username' => $_username);
        if (!$user) {
            $data['error']  = 'User-Id does not exist';
            return $this->render(
                'login.html.twig',
                $data
            );
        }

        $encoder = $encoderFactory->getEncoder($user);
        $salt = $user->getSalt();
        #$encoder = $this->encodePassword($_password, $salt);

        if (!$encoder->isPasswordValid($user->getPassword(), $encoder)) {
            $data['error'] = 'User-Id or Password not valid.';
            return $this->render(
                'login.html.twig',
                $data
            );
        } 

        return $this->redirect($this->generateUrl('default__home_page'));
    }

    return $this->render(
        'login.html.twig',
     $data
    );
}

我的编码安全性是:

security:
   encoders:
        App\Entity\User: bcrypt
        App\Security\User\WebserviceUser: bcrypt
        Symfony\Component\Security\Core\User\User: bcrypt
        FOS\UserBundle\Model\UserInterface: sha512
# https://symfony.com/doc/current/security.html#where-do-users-come-from-    user-providers
    providers:
        #in_memory: { memory: ~ }
        our_db_provider:
            entity:
                class: App:User
                property: username
    fos_userbundle:
        id: fos_user.user_provider.username_email
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    secured_area:
        anonymous: ~
        pattern:    ^/s/login$
        http_basic: ~
        provider: fos_userbundle
        user_checker: security.user_checker

        form_login:
            login_path: login_page
            check_path: login_page
            failure_handler: security.authentication.failure_handler
        guard:
            authenticators:
                - App\Security\LoginControllerAuthenticator
        # activate different ways to authenticate

        # http_basic: ~
        # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

        # form_login: ~
        # http://symfony.com/doc/current/cookbook/security/form_login_setup.html

        logout:
            path:   /logout/
            target: /login/

是否有任何替代方法或服务可以按照上述代码对我的密码进行编码。

错误:

No encoder has been configured for account "App\Entity\User".

  at vendor/symfony/security/Core/Encoder/EncoderFactory.php:51
  at Symfony\Component\Security\Core\Encoder\EncoderFactory->getEncoder(object(User))
     (src/Controller/Controller.php:65)
  at App\Controller\Controller->loginAction(object(Request))
     (vendor/symfony/http-kernel/HttpKernel.php:149)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:66)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:188)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:37)

提前致谢。

【问题讨论】:

    标签: symfony4 symfony-3.2


    【解决方案1】:

    见文档:

    https://symfony.com/doc/current/components/security/authentication.html#the-password-encoder-factory

    您可以通过这种方式在控制器中获取编码器。

    编辑:

    这里是一个例子:

        $defaultEncoder = new MessageDigestPasswordEncoder('sha512', true, 5000);
    
        $encoders = [
          User::class => $defaultEncoder, // Your user class. This line specify you ant sha512 encoder for this user class
        ];
    
        $encoderFactory = new EncoderFactory($encoders);
    
        $user = new User('test', null); // The user you want to authenticate
    
        $password = $encoderFactory->getEncoder($user)->encodePassword('myPassword', 'mySalt');
    

    编辑 2:

    你必须在那里定义你的用户类:

    $encoders = [
        App\Entity\User::class => $defaultEncoder,
        ];
    

    检查你没有使用 User Symfony 类。

    【讨论】:

    • 我没有从文档中清除我为什么在这里...你能建议我如何覆盖上面的代码
    • 我更新了代码。如果您有任何问题,请告诉我。您可以发布您的用户提供商?
    • 我得到了No encoder has been configured for account "App\Entity\User"的错误,但我在security.yaml中配置了这个
    • 我更新了我的答案。检查您为您的用户类添加编码器。
    • 会不会是在yaml中使用bcrypt配置了编码器,而在控制器中使用sha512创建了MessageDigestPasswordEncoder?两种不同的算法?
    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 2012-07-03
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多