Изучение 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"} []
Какие-либо предложения? Я целый день искал решение, и я уверен, что это глупая ошибка новичка, но все же ... ничего.
Затем в целях безопасности: добавьте «hide_user_not_found: false». Это изменит сообщение об ошибке на «Пользователь не найден» или «неверный пароль» и сузит круг возможных проблем. Я подозреваю, что проблема в кодировке пароля при регистрации. Хотя то, что у вас есть, выглядит правильно. Предполагая, что ваш $ user действительно является App \ Entity \ User, а не пользователем Symfony по умолчанию.
Вначале я думал, что это тоже связано с кодированием, поэтому я следовал руководству по регистрации, поэтому процесс кодирования выполняется symfony и должен работать нормально (в моей первой попытке я вручную создал первого пользователя и вставил sha512 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'
);
}
Посмотрите на проблему в этом фрагменте кода:
/**
* @ORM\Column(type = "string", length=64)
*/
private $password;
SHA512 фактически возвращает строку длиной 128. Итак, краткий ответ: ваше поле должно содержать всего 128 символов.
Вы должны установить длину 128 или больше или вообще не задавать, и по умолчанию будет установлено 255
/**
* @ORM\Column(type = "string")
*/
private $password;
И после этих изменений вы должны вручную или с помощью миграции исправить длину поля в таблице базы данных.
Начните с проверки, что у вас включен csrf в framework.yaml: symfony.com/doc/current/security/csrf.html