2013-09-04 13 views
0

Я последовал за этим guide, чтобы реализовать свой собственный пользовательский логин. К сожалению, во время входа в систему написано Bad credentials. Это исключение исходит из строки 72 Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider. Это исключение получает, потому что оно не может получить пользователя.Пользовательский пользователь Symfony2 не может получить пользователя

Что я изменил для своих пользовательских потребностей, так это то, что пользователи не имеют имени пользователя. Они войдут в систему со своим адресом электронной почты. Но я думаю, что это не проблема для реализации.

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 } 

UserRepository:

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()); 
    } 
} 

login.twig.html:

{% 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> 

Что я сделал здесь ошибку? В UserRepository он явно запрашивает электронное письмо как имя пользователя, так почему он не может найти пользователя? У меня есть предположение, что это имеет какое-то отношение к csrf_token? Как я могу добавить его в файл контроллера и twig? Неужели это проблема вообще, это что-то еще, что я сделал неправильно?

+0

Попробуйте установить имя поля '_username' вместо' _email'. –

+0

Thx, теперь исключение попадает в строку 89 вместо 72. Но я думаю, что это все еще есть чем-то, что он не может найти пользователя? – tester

+0

Хорошо, сообщение об исключении: 'Представленный пароль недействителен'. Я этого не понимаю. У меня есть кодировщик с открытым текстом, и я дважды проверял правильность пароля. Что не так? – tester

ответ

0

По умолчанию в системе Symfony используются параметры _username и _password для аутентификации пользователя через форму submit. Вы можете увидеть его в security configuration reference

form_login: 
    username_parameter: _username 
    password_parameter: _password 

Так что вам нужно поместить _username имя поля insteadof _email.

Смежные вопросы