Изучение Symfony — трудное путешествие, и я знал, что посты на SO будут следовать, поэтому вот моя проблема: классическая страница входа, я следовал этот урок и до этого я следовал форма регистрации руководство.
Регистрация работает нормально, пользователь вставляется в базу данных с правильной информацией, проблема заключается в входе в систему, потому что независимо от того, что я пробовал, Неверные учетные данные появится сообщение об ошибке, я пытался с несколькими пользователями, но ничего, я не могу найти ошибку, все кажется правильным, я проверял много раз. Итак, пришло время показать код, я думаю:
Моя форма входа:
<form class="form-horizontal" role="form" method="POST" action="{{ path('login') }}">
...
...
<input type="text" name="_username" class="form-control" id="name"placeholder="Your username" value="{{ last_username }}" required autofocus>
...
...
<input type="password" name="_password" class="form-control" id="password"placeholder="Password" required>
<input type="hidden" name="_target_path" value="/admin" />
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
Мой контроллер, который обрабатывает логин:
/**
* @Route("/login", name="login")
*
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils)
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('main/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
В основном копия-вставка из учебника. Я установил код в моем файле security.yalm:
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
the_user_provider:
entity:
class: App\Entity\User
property: name
encoders:
App\Entity\User:
algorithm: sha512
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
form_login:
login_path: login
check_path: login
csrf_token_generator: security.csrf.token_manager
# https://symfony.com/doc/current/security/form_login_setup.html
provider: the_user_provider
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/admin, roles: ROLE_USER }
# - { path: ^/profile, roles: ROLE_USER }
Кроме того, поскольку я не знаю, в чем может быть проблема, вот часть логики регистрации, которая кодирует пароль пользователя:
public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, Sluggify $sluggify) {
...
...
// 3) Encode the password (you could also do this via Doctrine listener)
$password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
И, конечно, внутри моего пользователь Я уже установил plainPassword и getPlainPassword:
...
...
/**
* @ORM\Column(type="string", length=64)
*/
private $password;
/**
* @Assert\NotBlank()
* @Assert\Length(max=4096)
*/
private $plainPassword;
...
...
public function getPlainPassword()
{
return $this->plainPassword;
}
Для завершения вот последние строки в моем dev.log файл :
[2018-03-17 16:35:06] request.INFO: Matched route "login". {"route":"login","route_parameters":{"_controller":"App\\Controller\\MainController::login","_route":"login"},"request_uri":"http://127.0.0.1:8000/login","method":"POST"} []
[2018-03-17 16:35:06] doctrine.DEBUG: SELECT t0.id AS id_1, t0.name AS name_2, t0.email AS email_3, t0.slug AS slug_4, t0.avatar AS avatar_5, t0.password AS password_6, t0.is_author AS is_author_7, t0.is_active AS is_active_8 FROM user t0 WHERE t0.name = ? LIMIT 1 ["K3nzie"] []
[2018-03-17 16:35:06] security.INFO: Authentication
php - Symfony 4 invalid credentials on login - Stack Overflow
Решение
Изучение Symfony - трудное путешествие, и я знал, что посты на SO будут следовать, поэтому вот моя проблема: классическая страница входа, я следовал этот урок и до этого я следовал форма регистрации руководство.
Регистрация работает нормально, пользователь вставляется в базу данных с правильной информацией, проблема заключается в входе в систему, потому что независимо от того, что я пробовал, Неверные учетные данные появится сообщение об ошибке, я пытался с несколькими пользователями, но ничего, я не могу найти ошибку, все кажется правильным, я проверял много раз. Итак, пришло время показать код, я думаю:
Моя форма входа:
<form class="form-horizontal" role="form" method="POST" action="{{ path('login') }}">
...
...
<input type="text" name="_username" class="form-control" id="name"placeholder="Your username" value="{{ last_username }}" required autofocus>
...
...
<input type="password" name="_password" class="form-control" id="password"placeholder="Password" required>
<input type="hidden" name="_target_path" value="/admin" />
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
Мой контроллер, который обрабатывает логин:
/**
* @Route("/login", name="login")
*
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils)
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('main/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
В основном копия-вставка из учебника. Я установил код в моем файле security.yalm:
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
the_user_provider:
entity:
class: App\Entity\User
property: name
encoders:
App\Entity\User:
algorithm: sha512
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
form_login:
login_path: login
check_path: login
csrf_token_generator: security.csrf.token_manager
# https://symfony.com/doc/current/security/form_login_setup.html
provider: the_user_provider
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/admin, roles: ROLE_USER }
# - { path: ^/profile, roles: ROLE_USER }
Кроме того, поскольку я не знаю, в чем может быть проблема, вот часть логики регистрации, которая кодирует пароль пользователя:
public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, Sluggify $sluggify) {
...
...
// 3) Encode the password (you could also do this via Doctrine listener)
$password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
И, конечно, внутри моего пользователь Я уже установил plainPassword и getPlainPassword:
...
...
/**
* @ORM\Column(type="string", length=64)
*/
private $password;
/**
* @Assert\NotBlank()
* @Assert\Length(max=4096)
*/
private $plainPassword;
...
...
public function getPlainPassword()
{
return $this->plainPassword;
}
Для завершения вот последние строки в моем dev.log файл :
[2018-03-17 16:35:06] request.INFO: Matched route "login". {"route":"login","route_parameters":{"_controller":"App\\Controller\\MainController::login","_route":"login"},"request_uri":"http://127.0.0.1:8000/login","method":"POST"} []
[2018-03-17 16:35:06] doctrine.DEBUG: SELECT t0.id AS id_1, t0.name AS name_2, t0.email AS email_3, t0.slug AS slug_4, t0.avatar AS avatar_5, t0.password AS password_6, t0.is_author AS is_author_7, t0.is_active AS is_active_8 FROM user t0 WHERE t0.name = ? LIMIT 1 ["K3nzie"] []
[2018-03-17 16:35:06] security.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at /home/k3nzie/projects/symfonyWebsite/vendor/symfony/security/Core/Authentication/Provider/UserAuthenticationProvider.php:88, Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): The presented password is invalid. at /home/k3nzie/projects/symfonyWebsite/vendor/symfony/security/Core/Authentication/Provider/DaoAuthenticationProvider.php:65)"} []
[2018-03-17 16:35:06] security.DEBUG: Authentication failure, redirect triggered. {"failure_path":"login"} []
[2018-03-17 16:35:06] request.INFO: Matched route "login". {"route":"login","route_parameters":{"_controller":"App\\Controller\\MainController::login","_route":"login"},"request_uri":"http://127.0.0.1:8000/login","method":"GET"} []
[2018-03-17 16:35:06] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2018-03-17 16:35:07] request.INFO: Matched route "_wdt". {"route":"_wdt","route_parameters":{"_controller":"web_profiler.controller.profiler:toolbarAction","token":"62995d","_route":"_wdt"},"request_uri":"http://127.0.0.1:8000/_wdt/62995d","method":"GET"} []
Какие-либо предложения? Я весь день искал решение и уверен, что это глупая ошибка новичка, но все же ... ничего.
Другие решения
Смотрите проблему в этой части кода:
/**
* @ORM\Column(type="string", length=64)
*/
private $password;
SHA512 на самом деле возвращает строку длиной 128. Таким образом, краткий ответ, ваше поле должно быть только 128 символов.
Вы должны установить длину в 128 или более или не устанавливать вообще, и она будет установлена в 255 по умолчанию
/**
* @ORM\Column(type="string")
*/
private $password;
И после этих изменений вы должны исправить длину поля в таблице базы данных вручную или путем миграции.
Я столкнулся с той же проблемой. Попробуйте изменить $ user-> getPlainPassword (). Я считаю, что getPlainPassword является функцией построителя форм, и вы создали свою собственную форму, поэтому вам нужно связать свои переменные с объектом запроса.
В моем коде я сделал это так.
$password = $passwordEncoder->encodePassword($user, $params['password']);
/**
* @Route("/register", name="user_registration")
*/
public function registerAction(Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
$params = $request->request->all();
if ($request->isMethod("POST")) {
$user = new User();
$user->setFname($params["fname"]);
$user->setLname($params["lname"]);
$user->setEmail($params["email"]);
$user->setUsername($params["username"]);
$user->setCreatedAt(new \DateTime());
//$user->setPassword($params['password']);
$password = $passwordEncoder->encodePassword($user, $params['password']);
$user->setPassword($password);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('login');
}
return $this->render(
'default/register.html.twig'
);
}