Я использую symfony 2.5, и я столкнулся с контрольно-пропускным пунктом.
Я использую SecurityContext
в соответствии с документацией symfony для аутентификации пользователей. В частности, я в настоящее время имею:
$securityContext = $this->container->get('security.context');
# If authenticated through Symfony
if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY'))
{
return $this->redirect($this->generateUrl('accounts_dashboard'), 301);
}
.....
Это хорошо работает, но это приложение регистрирует пользователей из нескольких мест и в то время, когда мы не контролировали дублирование регистрации. Это означает, что у нас есть несколько записей для одного и того же адреса электронной почты.
Из-за этого, когда кто-то пытается войти в систему и есть несколько учетных записей под тем же адресом электронной почты, процедура входа в систему завершается неудачно, потому что она выбирает неправильную учетную запись.
У меня есть другие поля в базе данных, которые я мог бы использовать для соответствия правильным учетным записям, таким как активный статус, последний IP-адрес входа в систему или даже дата последнего входа. Проблема в том, что я не уверен, как создавать дополнительные проверки во время входа в систему, чтобы правильно проверить эту информацию.
Какой был бы правильный подход без необходимости переделать всю логистику логистики, чтобы я мог выполнять дополнительные проверки в базе данных для предоставленного адреса электронной почты перед вызовом SecurityContext
и остальной процедурой входа? По сути, я просто пытаюсь выполнить дополнительные проверки после того, как логин был отправлен, чтобы убедиться, что правильная учетная запись выбрана вместо первого совпадения в базе данных.
UserProvider должен возвращать пользователя по имени пользователя, ничего другого, он не должен делать какую-то тяжелую логику. Я думаю, вы можете попытаться создать свой собственный аутентификатор, как описано здесь, реализовав интерфейс SimpleFormAuthenticatorInterface
.
Вам необходимо реализовать пользовательский UserProvider. Пример:
<?php
namespace Acme\Security\Authorization;
use Symfony\Bridge\Doctrine\Security\User\EntityUserProvider;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
class MyCustomEmailUserProvider extends EntityUserProvider
{
/**
* {@inheritdoc}
*/
public function loadUserByUsername($username)
{
//your code to get user by email goes here
// if you found User, you need to return it from this method, otherwise throw an exception
throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
}
}
Вам не нужно расширять EntityUserProvider
, вы можете рассмотреть свою собственную реализацию UserProviderInterface
.
Зарегистрируйте его как услугу (при условии, что имя службы security.my_custom_email_user_provider
), добавьте необходимые зависимости и затем добавьте ее в security.yml
:
providers:
main:
id: security.my_custom_email_user_provider
И затем используйте этот провайдер в своей форме входа:
firewalls:
firewall_name:
form_login:
provider: main
За дополнительной информацией обратитесь к статье "Поваренная книга".
providers: main: class: bundle\Security\User\CustomUserProvider
но класс customuserprovider, похоже, ничего не делает. Чтобы проверить, я попытался вернуть недопустимого пользователя, и он все еще вошел в систему. Поэтому я думаю, что регистрация службы происходит неправильно?
security.my_custom_email_user_provider
в своем конфигурационном файле для сервисов, затем я добавил этот зарегистрированный сервис под security.yml
используя его идентификатор, но ни один из них, похоже, не оказывает никакого влияния на веб-сайт. так как я все еще могу войти в систему без проблем, когда я не должен думать, что я принудительно возвращаю неверное имя пользователя в классе customuserprovider.