Я последовал за этим 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? Неужели это проблема вообще, это что-то еще, что я сделал неправильно?
Попробуйте установить имя поля '_username' вместо' _email'. –
Thx, теперь исключение попадает в строку 89 вместо 72. Но я думаю, что это все еще есть чем-то, что он не может найти пользователя? – tester
Хорошо, сообщение об исключении: 'Представленный пароль недействителен'. Я этого не понимаю. У меня есть кодировщик с открытым текстом, и я дважды проверял правильность пароля. Что не так? – tester