pokupo
@pokupo
Разработчик, архитектор, предприниматель

Как авторизовать пользователя через SecurityBundle & FOSUserBundle в другом модуле?

Разбираюсь с авторизацией через SecurityBundle все отлично работает в штатном режиме (бандл наследуется от FOSUserBundle и в нем переопределяется часть функционала), но возникла потребность выполнить авторизацию пользователя в другом контроллере другого бандла этого же проекта. Выполняется вызов другого роутера, который не относится к базовому бандлу в нем необходимо выполнить проверку логина пароля и авторизовать пользователя или выдать ошибку, сейчас я реализовал это в хардкор-варианте, т.е. прямо получаю из репозитория пользователя по логину, вычисляю хеш пароля и сравниваю с хешем в базе.



Что бы было более понятно, вот мой «код»:

$request = $this->get('request');<br>
if ('POST' == $request->getMethod() || 'GET' == $request->getMethod()) {<br>
    $username = $request->get('username');<br>
    $password = $request->get('password');<br>
    $em = $this->getDoctrine()->getManager();<br>
    $userEntity = $em->getRepository('MyBundle:User')->findOneBy(array('username' => $username));<br>
    if (!$userEntity) {<br>
        return $this->getResponseError('404', $typeResponse);<br>
    }<br>
    $factory = $this->get('security.encoder_factory');<br>
    $encoder = $factory->getEncoder($userEntity);<br>
    $encodePassword = $encoder->encodePassword($password, $userEntity->getSalt());<br>
    if ($encodePassword == $userEntity->getPassword()) {<br>
        $response = new Response;<br>
        if (!$this->authenticateUser($userEntity, $response)) {<br>
            return $this->getResponseError('User locked', $typeResponse);<br>
        }<br>
    } else {<br>
        return $this->getResponseError('Wrong password or login', $typeResponse);<br>
    }<br>
}<br>




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

Прошу помощи у уважаемых разработчиков.
  • Вопрос задан
  • 4221 просмотр
Пригласить эксперта
Ответы на вопрос 2
JekaRu
@JekaRu
События ядра в классе KernelEvents.
По идее просто вешаетесть на kernel.request. В методе обработчике ваш код будет
Должно получится что-то типа этого:
class AutenticatorListener
{
    private $securityContext;
    private $firewall;

    public function __construct(SecurityContext $securityContext, $firewall)
    {
        $this->securityContext = $securityContext;
        $this->firewall        = $firewall;
    }

    public function checkLogin(GetResponseEvent $event)
    {
        if (HttpKernel::SUB_REQUEST == $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        // ...  ваш код
        //....
        //....

        $token = new UsernamePasswordToken($user, null, $this->firewall, $user->getRoles());
        $this->securityContext->setToken($token);
    }
}

Ответ написан
Neutral
@Neutral
В профайлере есть закладка Events — там можно посмотреть события, для которых зарегистрированы слушатели. Полный список событий нужно искать в документации к библиотекам или непосредственно в коде. Для FOSUser нужно смотреть класс FOSUserEvents.

Пользователя из БД можно получить через сервис fos_user.user_provider.username или fos_user.user_provider.username_email, а залогинить через fos_user.security.login_manager.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы