Дополнительные проверки безопасности при входе в Symfony

1

Я использую 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 и остальной процедурой входа? По сути, я просто пытаюсь выполнить дополнительные проверки после того, как логин был отправлен, чтобы убедиться, что правильная учетная запись выбрана вместо первого совпадения в базе данных.

  • 1
    Я должен очистить эту таблицу, прежде чем идти дальше. написать сценарий, который сравнивает электронные письма и сохранить только тот, который с последним logindate в новую пользовательскую таблицу
  • 0
    @Frankbeen то, что вы предлагаете, звучит как попытка убрать беспорядок путем создания нового беспорядка (вторая таблица пользователя). В долгосрочной перспективе это приложение позволит избежать создания дублирующих учетных записей, но это впереди меня. Непосредственным требованием является возможность иметь дело с существующими дублирующимися аккаунтами.
Теги:
authentication
validation
login

2 ответа

0

UserProvider должен возвращать пользователя по имени пользователя, ничего другого, он не должен делать какую-то тяжелую логику. Я думаю, вы можете попытаться создать свой собственный аутентификатор, как описано здесь, реализовав интерфейс SimpleFormAuthenticatorInterface.

  • 0
    Я ценю ваш ответ, но, как я объяснил в своем первоначальном посте, я не могу позволить себе провести рефакторинг всего приложения, и переделка аутентификации сейчас заставит меня сделать это из-за способа, которым приложение было построено, поэтому я сейчас ищу простой способ сообщить Symfony, какое имя пользователя и адрес электронной почты будут использоваться в целях аутентификации, а не позволять ему найти первую запись из базы данных.
  • 0
    @JoseRLopezmomon Вам не нужно проводить рефакторинг проекта, просто добавьте класс аутентификатора, зарегистрируйте его в качестве службы, добавьте его в существующий брандмауэр, очистите кэш, вот и все.
Показать ещё 1 комментарий
0

Вам необходимо реализовать пользовательский 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

За дополнительной информацией обратитесь к статье "Поваренная книга".

  • 0
    Спасибо. Я могу полностью понять логику здесь, но у меня есть трудности для реализации. Я создал класс bundle \ Security \ User \ CustomUserProvider.php с вашим примером и назвал класс CustomUserProvider. Затем я добавил службу как: providers: main: class: bundle\Security\User\CustomUserProvider но класс customuserprovider, похоже, ничего не делает. Чтобы проверить, я попытался вернуть недопустимого пользователя, и он все еще вошел в систему. Поэтому я думаю, что регистрация службы происходит неправильно?
  • 0
    Я должен извиниться, это не имело особого смысла. Я хочу сказать, что я создал такой сервис, как: security.my_custom_email_user_provider в своем конфигурационном файле для сервисов, затем я добавил этот зарегистрированный сервис под security.yml используя его идентификатор, но ни один из них, похоже, не оказывает никакого влияния на веб-сайт. так как я все еще могу войти в систему без проблем, когда я не должен думать, что я принудительно возвращаю неверное имя пользователя в классе customuserprovider.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню