Symfony 登录错误 - 凭据无效


Symfony Login error - Invalid credentials

我有一个我想登录用户的表单 - 我已经将灯具加载到数据库中,但是当我尝试以下教程时,我不断得到错误的凭据或无效的凭据,我将包括我所有相关文件,如果有人可以指出我缺少ID的任何内容,请永远欠您的债!

 <?php
 namespace AppBundle'Forms;
 use Symfony'Component'Form'Extension'Core'Type'TextType;
 use Symfony'Component'Form'Extension'Core'Type'PasswordType;
 use Symfony'Component'Form'AbstractType;
 use Symfony'Component'Form'FormBuilderInterface;
 use Symfony'Component'OptionsResolver'OptionsResolver;
 use Symfony'Component'Validator'Constraints'NotBlank;
class LoginType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add(
                'username',
                TextType::class, [
                    'constraints' => [
                        new NotBlank()
                    ]
                ]
            )
            ->add(
                'password',
                PasswordType::class, [
                    'constraints' => [
                        new NotBlank()
                    ]
                ]
            );
    }
    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'data_class' => 'AppBundle'Entity'User'
        ]);
    }
}

和我的控制器 -

<?php
namespace AppBundle'Controller'Login;
use AppBundle'Entity'User;
use AppBundle'Forms'LoginType;
use AppBundle'Repository'UserRepository;
use Symfony'Component'HttpFoundation'RedirectResponse;
use Symfony'Component'HttpFoundation'Response;
use Symfony'Component'Security'Core'Encoder'UserPasswordEncoder;
use Symfony'Component'Templating'EngineInterface;
use Symfony'Component'Form'FormFactoryInterface;
use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'Routing'RouterInterface;
use Symfony'Component'Security'Http'Authentication'AuthenticationUtils;
class LoginpageController {
    protected $formFactory;
    protected $templating;
    protected $router;
    protected $authenticationUtils;
    protected $encoder;
    protected $userRepository;
    public function __construct (
        FormFactoryInterface $formFactory,
        EngineInterface $templating,
        RouterInterface $router,
        AuthenticationUtils $authenticationUtils,
        UserPasswordEncoder $encoder,
        UserRepository $userRepository
    ) {
        $this->formFactory = $formFactory;
        $this->templating = $templating;
        $this->router = $router;
        $this->authenticationUtils = $authenticationUtils;
        $this->encoder = $encoder;
        $this->userRepository = $userRepository;
    }
    public function __invoke(Request $request) {
        $user = new User();
        $form = $this->formFactory->create(LoginType::class, $user);
        $form->handleRequest($request);
        if($form->isValid()) {
            return new RedirectResponse (
                $this->router->generate('home'),
                Response::HTTP_TEMPORARY_REDIRECT
            );
        }
        // get the login error if there is one
        $error = $this->authenticationUtils->getLastAuthenticationError();
        return new Response(
            $this->templating->render(
                'AppBundle:loginpage:loginpage.html.twig', [
                    'form' => $form->createView(),
                    'error'         => $error
                ]
            )
        );
    }
}

我的表格 -

 {% if error %}
     <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
 {% endif %}
  <form method="POST" action="{{ path('login') }}">
  {{ form_start(form) }}
  {{ form_row(form.username) }}
  <br>
  {{ form_row(form.password) }}
  <br>
  <br>
  <input type="submit" value="submit"/>
  {{ form_end(form) }}
  </form>

我的安全 -

security:
    providers:
        user_database:
            entity:
                class: AppBundle:User
    encoders:
        AppBundle'Entity'User:
            algorithm: bcrypt
            cost: 11
    firewalls:
    # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
        main:
           pattern:   ^/
           anonymous: ~
           provider: user_database
           form_login:
              login_path: /login
              check_path: /login
           logout:
              path:   /logout
              target: /
    access_control:
         - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

回购-

<?php
namespace AppBundle'Repository;
use AppBundle'Entity'User;
use Doctrine'ORM'EntityRepository;
use Symfony'Bridge'Doctrine'Security'User'UserLoaderInterface;
use Symfony'Component'Security'Core'Exception'UsernameNotFoundException;
class UserRepository extends EntityRepository implements  UserLoaderInterface {
    public function save(User $user) {
        $this->_em->persist($user);
        $this->_em->flush();
    }
    public function delete(User $user) {
        $this->_em->remove($user);
        $this->_em->flush();
    }
    public function loadUserByUsername($username) {
        $user = $this->createQueryBuilder('u')
            ->where('u.username = :username or u.email = :email')
            ->setParameter('username', $username)
            ->setParameter('email', $username)
            ->getQuery()
            ->getOneOrNullResult();
        if (null === $user) {
            $message = print_r(
                'Unable to find an active admin AppBundle:User object identified by "%s".',
                $username
            );
            throw new UsernameNotFoundException($message);
        }
        return $user;
    }
}

ORM映射 -

 <?xml version="1.0" encoding="utf-8"?>
 <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity repository-class="AppBundle'Repository'UserRepository" name="AppBundle'Entity'User" table="user">
<id name="id" type="guid" column="id">
  <generator strategy="UUID"/>
</id>
<field name="firstName" type="string" column="first_name" length="255"/>
<field name="lastName" type="string" column="last_name" length="255"/>
<field name="email" type="string" column="email" length="255" unique="true"/>
<field name="username" type="string" column="username" length="255" unique="true"/>
<field name="password" type="string" column="password" length="4096"/>
<field name="roles" type="string" column="roles" length="255"/>
<field name="createdAt" type="datetime" column="createdAt"/>
<field name="isActive" type="boolean" column="isActive"/>
</entity>
</doctrine-mapping>

我也被这条错误消息咬了。

我的

原因是我的用户表中有重复的用户名(因此在选择用户名时返回的不是一个而是多个用户)。我不知道为什么我忘记了这个...

因此,请确保您的用户名列/字段具有唯一的索引。很明显,但我希望它能节省某人的时间。

在您的实体之上:

/**
 * @ORM'Entity()
 * @UniqueEntity("username")
 */

在实体类的主体中:

/**
 * @ORM'Column(unique=true, type="string", nullable=false)
 */
private $username;

我发现了我的问题!

在我的夹具数据中,我调用了另一个变量进行编码,因为我的密码在这里是差异

public function load(ObjectManager $manager)
{
    foreach ($this->users as $user) {
        $userAdmin = new User();
        $userAdmin->setName($user['name']);
        $userAdmin->setEmail($user['email']);
        $userAdmin->setPassword($user['password']);
        $encoder = $this->container->get('security.password_encoder');
        $password = $encoder->encodePassword($userAdmin, 'secret.password');
        $userAdmin->setPassword($password);
        $userAdmin->setRoles($user['roles']);
        $userAdmin->setUsername($user['username']);
        $userAdmin->setIsActive($user['isActive']);
        $userAdmin->setCreatedAt(new 'DateTime('now'));
        $manager->persist($userAdmin);
    }
    $manager->

修复:

public function load(ObjectManager $manager)
{
    foreach ($this->users as $user) {
        $userAdmin = new User();
        $userAdmin->setName($user['name']);
        $userAdmin->setEmail($user['email']);
        $userAdmin->setPassword($user['password']);
        $encoder = $this->container->get('security.password_encoder');
        $password = $encoder->encodePassword($userAdmin, $userAdmin->getPassword());
        $userAdmin->setPassword($password);
        $userAdmin->setRoles($user['roles']);
        $userAdmin->setUsername($user['username']);
        $userAdmin->setIsActive($user['isActive']);
        $userAdmin->setCreatedAt(new 'DateTime('now'));
        $manager->persist($userAdmin);
    }
    $manager->flush();
}