Я обновил свой сайт с 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)
Заранее спасибо.