Ошибка от Symfony3.2 до symfony4 security.encoder_factory устарела - PullRequest
0 голосов
/ 15 ноября 2018

Я обновил свой сайт с Symfony 3.2 до Symfony 4, создав новый скелет symfony4 и переместив исходный код с symfony3.2 на symfony4.

Я внес изменения, упомянутые в .Обновление 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/StudentController.php:65)
  at App\Controller\StudentController->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)

Заранее спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

См. Документ:

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,
    ];

Убедитесь, что вы не используете класс Symfony пользователя.

...