Email Symfony2自定义用户提供程序可以';无法检索用户

Email Symfony2自定义用户提供程序可以';无法检索用户,email,symfony,login,Email,Symfony,Login,我遵循这一点来实现自己的自定义用户登录。不幸的是,它在登录时显示错误凭据。此异常来自Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider的第72行。引发此异常是因为它无法检索用户 我为我的自定义需求所做的更改是,用户没有用户名。他们将使用自己的电子邮件地址登录。但我认为实施起来没有问题 security.yml: security: encoders: Acme

我遵循这一点来实现自己的自定义用户登录。不幸的是,它在登录时显示
错误凭据。此异常来自
Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider
的第72行。引发此异常是因为它无法检索用户

我为我的自定义需求所做的更改是,用户没有用户名。他们将使用自己的电子邮件地址登录。但我认为实施起来没有问题

security.yml:

security:
    encoders:
        Acme\UserBundle\Entity\User: plaintext

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        administrators:
            entity: { class: AcmeUserBundle:User }

    firewalls:
        secured_area:
            pattern: ^/
            anonymous: ~
            form_login: ~

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }
class UserRepository extends EntityRepository implements UserProviderInterface
{
    public function loadUserByUsername($username)
    {
        $q = $this
            ->createQueryBuilder('u')
            ->where('u.email = :email')
            ->setParameter('email', $username)
            ->getQuery();

        try {
            // The Query::getSingleResult() method throws an exception
            // if there is no record matching the criteria.
            $user = $q->getSingleResult();
        } catch (NoResultException $e) {
            $message = sprintf(
                'Unable to find an active admin AcmeUserBundle:User object identified by "%s".',
                $username
            );
            throw new UsernameNotFoundException($message, 0, $e);
        }

        return $user;
    }

    public function refreshUser(UserInterface $user)
    {
        $class = get_class($user);
        if (!$this->supportsClass($class)) {
            throw new UnsupportedUserException(
                sprintf(
                    'Instances of "%s" are not supported.',
                    $class
                )
            );
        }

        return $this->find($user->getId());
    }

    public function supportsClass($class)
    {
        return $this->getEntityName() === $class
        || is_subclass_of($class, $this->getEntityName());
    }
}
{% if error %}
    <div>{{ error.message }}</div>
{% endif %}

<form action="{{ path('login_check') }}" method="post">
    <legend>Login</legend>
    <label for="email">Email:</label>
    <input type="email" id="email" name="_email" value="{{ email }}"

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">Login</button>
</form>
用户存储库:

security:
    encoders:
        Acme\UserBundle\Entity\User: plaintext

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        administrators:
            entity: { class: AcmeUserBundle:User }

    firewalls:
        secured_area:
            pattern: ^/
            anonymous: ~
            form_login: ~

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }
class UserRepository extends EntityRepository implements UserProviderInterface
{
    public function loadUserByUsername($username)
    {
        $q = $this
            ->createQueryBuilder('u')
            ->where('u.email = :email')
            ->setParameter('email', $username)
            ->getQuery();

        try {
            // The Query::getSingleResult() method throws an exception
            // if there is no record matching the criteria.
            $user = $q->getSingleResult();
        } catch (NoResultException $e) {
            $message = sprintf(
                'Unable to find an active admin AcmeUserBundle:User object identified by "%s".',
                $username
            );
            throw new UsernameNotFoundException($message, 0, $e);
        }

        return $user;
    }

    public function refreshUser(UserInterface $user)
    {
        $class = get_class($user);
        if (!$this->supportsClass($class)) {
            throw new UnsupportedUserException(
                sprintf(
                    'Instances of "%s" are not supported.',
                    $class
                )
            );
        }

        return $this->find($user->getId());
    }

    public function supportsClass($class)
    {
        return $this->getEntityName() === $class
        || is_subclass_of($class, $this->getEntityName());
    }
}
{% if error %}
    <div>{{ error.message }}</div>
{% endif %}

<form action="{{ path('login_check') }}" method="post">
    <legend>Login</legend>
    <label for="email">Email:</label>
    <input type="email" id="email" name="_email" value="{{ email }}"

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">Login</button>
</form>
login.twig.html:

security:
    encoders:
        Acme\UserBundle\Entity\User: plaintext

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        administrators:
            entity: { class: AcmeUserBundle:User }

    firewalls:
        secured_area:
            pattern: ^/
            anonymous: ~
            form_login: ~

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }
class UserRepository extends EntityRepository implements UserProviderInterface
{
    public function loadUserByUsername($username)
    {
        $q = $this
            ->createQueryBuilder('u')
            ->where('u.email = :email')
            ->setParameter('email', $username)
            ->getQuery();

        try {
            // The Query::getSingleResult() method throws an exception
            // if there is no record matching the criteria.
            $user = $q->getSingleResult();
        } catch (NoResultException $e) {
            $message = sprintf(
                'Unable to find an active admin AcmeUserBundle:User object identified by "%s".',
                $username
            );
            throw new UsernameNotFoundException($message, 0, $e);
        }

        return $user;
    }

    public function refreshUser(UserInterface $user)
    {
        $class = get_class($user);
        if (!$this->supportsClass($class)) {
            throw new UnsupportedUserException(
                sprintf(
                    'Instances of "%s" are not supported.',
                    $class
                )
            );
        }

        return $this->find($user->getId());
    }

    public function supportsClass($class)
    {
        return $this->getEntityName() === $class
        || is_subclass_of($class, $this->getEntityName());
    }
}
{% if error %}
    <div>{{ error.message }}</div>
{% endif %}

<form action="{{ path('login_check') }}" method="post">
    <legend>Login</legend>
    <label for="email">Email:</label>
    <input type="email" id="email" name="_email" value="{{ email }}"

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">Login</button>
</form>
{%if错误%}
{{error.message}}
{%endif%}
登录
电邮:

默认情况下,Symfony security使用
\u用户名
\u密码
参数通过表单提交对用户进行身份验证。你可以从中看到它


因此,您需要将
\u username
字段名替换为
\u email

尝试将
\u username
字段名替换为
\u email
。Thx,现在将在第89行而不是第72行引发异常。但我认为这仍然与找不到用户有关?好的,异常消息是
提供的密码无效。
。我不明白。我有明文编码器,我仔细检查了密码是否正确。怎么了?好吧,我知道了。我忘了Symfony2总是用盐。所以现在它工作正常了。如果你愿意,你可以把你的评论放在一个我可以接受的答案中,因为这是主要问题的答案。