Скорее всего, мне не хватает какого-то глупого материала, но я потратил довольно много времени на это, поэтому любая помощь приветствуется.
Аутентификация основана на этом руководстве
Я использую bcrypt для кодирования пароля, и, похоже, он работает правильно при регистрации пользователя.
Но при входе в систему он вызывает ошибку ниже, хотя введенный пароль верен:
Недопустимые учетные данные.
Я подтвердил, что письмо и пароль поступают должным образом в аутентификатор входа (форма входа отправляется через Ajax).
Также метод getUser (), похоже, выполняет свою задачу по извлечению объекта $ user и соответствующего пароля из db.
Security.yml устанавливается следующим образом:
security: encoders: UsedBundle\Entity\User: algorithm: bcrypt
Это контроллер регистрации:
namespace UsedBundle\Controller; use UsedBundle\Form\UserType; use UsedBundle\Entity\User; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\JsonResponse; use UsedBundle\Service\sendEmail; class RegistrationController extends Controller { /** * @Route("/inscription", name="inscription") */ public function registerAction(Request $request) { $user = new User(); $form = $this->createForm(UserType::class, $user); if ($request->isMethod('POST')) { $form->submit($request->request->get($form->getName('user'))); if(!$form->isValid()){ // handle invalid form } if ($form->isSubmitted() && $form->isValid()) { $password = $this->get('security.password_encoder') ->encodePassword($user, $user->getPlainPassword()); $user->setPassword($password); $user->setUserKey( $user->getEmail() ); $user->setUserKeyTime(); $user->setDateReg(); $em = $this->getDoctrine()->getManager('used'); $em->persist($user); $em->flush(); return new JsonResponse(array( 'status' => 'ok', 'message' => 'Success!') ); } }else{ return $this->render( 'common/register.html.twig', array('form' => $form->createView()) ); } } }
Аутентификатор формы входа в систему (настройка как служба):
namespace UsedBundle\Security; use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Security; use UsedBundle\Entity\User; use UsedBundle\Repository\UserRepository; use Symfony\Component\Security\Core\Exception\BadCredentialsException; class FormLoginAuthenticator extends AbstractFormLoginAuthenticator { private $container; public function __construct(ContainerInterface $container) { $this->container = $container; } public function getCredentials(Request $request) { if ($request->getPathInfo() != '/login_check') { return; } $username = $request->request->get('_email'); $request->getSession()->set(Security::LAST_USERNAME, $username); $password = $request->request->get('_password'); return array( 'username' => $username, 'password' => $password ); } public function getUser($credentials, UserProviderInterface $userProvider) { $username = $credentials['username']; $user = $this->container ->get('doctrine') ->getRepository('UsedBundle:User', 'used') ->findOneByemail( $username ); return $user; } public function checkCredentials($credentials, UserInterface $user) { $plainPassword = $credentials['password']; $encoder = $this->container->get('security.password_encoder'); if (!$encoder->isPasswordValid($user, $plainPassword)){ throw new BadCredentialsException(); }else{ $this->pass_error = 'no error'; } } protected function getLoginUrl() { return $this->container->get('router') ->generate('homepage'); } protected function getDefaultSuccessRedirectUrl() { return $this->container->get('router') ->generate('homepage'); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) { // AJAX! Return some JSON if ($request->isXmlHttpRequest()) { return new JsonResponse( array('userId' => $token->getUser()->getId(), 'statut' => 'ok' ) ); } // for non-AJAX requests, return the normal redirect return parent::onAuthenticationSuccess($request, $token, $providerKey); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { return new JsonResponse( array('message' => $exception->getMessageKey(), 'statut' => 'error', 'passerror' => $this->pass_error ) ); }
Вывод var_dump ($ user) на checkCredentials () по запросу
object(UsedBundle\Entity\User)#329 (15) { ["id":"UsedBundle\Entity\User":private]=> int(7) ["avatar":"UsedBundle\Entity\User":private]=> string(11) "dsfdfafadfa" ["name":"UsedBundle\Entity\User":private]=> string(9) "dfdffadfa" ["password":"UsedBundle\Entity\User":private]=> string(64) "jjuewij/sc9Af17i+ZXAUcrdiZX83HHMLjTNVSnJ34qGCp6BAxisVtjiG3Nm+uH5" ["plainPassword":"UsedBundle\Entity\User":private]=> NULL ["email":"UsedBundle\Entity\User":private]=> string(22) "myemail@gmail.com" ["phone":"UsedBundle\Entity\User":private]=> string(12) "445454545454" ["roles":"UsedBundle\Entity\User":private]=> string(9) "ROLE_USER" ["isActive":"UsedBundle\Entity\User":private]=> bool(true)
как запрошено, выдержки из var_dump ($ exception) на onAuthenticationFailure ()
object(Symfony\Component\Security\Core\Exception\BadCredentialsException)#322 (8) { ["token":"Symfony\Component\Security\Core\Exception\AuthenticationException":private]=> object(Symfony\Component\Security\Guard\Token\PreAuthenticationGuardToken)#61 (6) { ["credentials":"Symfony\Component\Security\Guard\Token\PreAuthenticationGuardToken":private]=> array(2) { ["username"]=> string(22) "myemail@gmail.com" ["password"]=> string(8) "senha444" } ["guardProviderKey":"Symfony\Component\Security\Guard\Token\PreAuthenticationGuardToken":private]=> string(6) "main_0" ["user":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=> NULL ["roles":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=> array(0) { } ["authenticated":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=> bool(false) ["attributes":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=> array(0) { } } ["message":protected]=> string(0) "" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(78) "/Users/BAMAC/Sites/Symfony1/src/UsedBundle/Security /FormLoginAuthenticator.php" ["line":protected]=> int(58)