youlose
@youlose

Каким образом можно сделать валидацию данных формы для логина используя Security Bundle?

Доброе время суток, проблема у меня такого плана:

на сайте что я сейчас делаю аутентификация происходит по email, собственно я хотел бы до вызова login_check проверять валидный ли почтовый адрес указан или нет и выводить об этом ошибку (мало ли, человек неопытный и забыл .ru в конце добавить, например).

Собственно вижу несколько вариантов решения:

1. Сначала анализировать POST данные, проверять валидатором их правильность и потом каким либо образом сделать подзапрос к /login_check

2. Прописать failure_handler и в нём уже проверять правильность введённых данных.

3. Попробовать разобраться при помощи событий


1й вариант мне реализовать не удалось, так как при редиректах и форвардах я не разобрался как передавать параметры

2й мне не очень нравиться потому что валидация происходит после первой неправильной попытки, мне кажеться что должен быть вариант решения в том виде как я хочу сделать

3е — даже не пробовал, ибо это для меня пока дремучий лес


P.S. Таки сделал я 1й вариант, не очень правильно, но если гуру меня поправят буду очень благодарен (лишнее я вырезал в примере, а то непонятно о чём речь):
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
    

            if ($form->isValid()) {
                $req = Request::create(
                    $this->generateUrl('security_check'),
                    'POST',
                    array(
                        '_username' => $customer->getEmail(),
                        '_password' => $customer->getPass()
                    ),
                    $request->cookies->all(),
                    array(),
                    $request->server->all()
                );

                $resp = $this->get('http_kernel')->handle($req,HttpKernelInterface::MASTER_REQUEST);
                if ($security_context->getToken()) {
                  return $resp;  
                } else {
                    $auth_errors []= 'Неверно набраны почтовый ящик и/или пароль';
                }
            }



P.P.S. Но теперь покопавшись в исходниках + увидев что после моих предыдущих махинаций какие-то совсем уж рекурсивно запутанные сессии получились, я считаю что правильный вариант — №3, как научусь вручную вызывать события — напишу, ибо в документации не нашёл про это.
  • Вопрос задан
  • 3062 просмотра
Пригласить эксперта
Ответы на вопрос 3
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Склоняюсь ко второму варианту, но без failure_handler
С точки зрения пользователя форма была отправлена и неважно был запрос к базе или нет.
// src/Acme/SecurityBundle/Controller/Main;
namespace Acme\SecurityBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;

class SecurityController extends Controller
{
    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();

        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
            $session->remove(SecurityContext::AUTHENTICATION_ERROR);
        }

        if ($error && !filter_var(SecurityContext::LAST_USERNAME, FILTER_VALIDATE_EMAIL)) {
            $error = new \Exception('Invalid e-mail');
        }

        return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
            // last username entered by the user
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error,
        ));
    }
}


плюс проверка на стороне пользователя
Ответ написан
@nuclear
А почему не сделать валидацию стандартным способом?
Ответ написан
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Еще, как вариант, создать свой UserProvider
(можно унаследовать от github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php), у которого в методе loadUserByUsername сначала проверять $username на валидность.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы