AJAX логин не может отобразить имя пользователя - всегда NULL - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь перейти с обычной формы входа в систему AJAX. Все работает отлично без ajax, но когда я пытался реализовать это, но произошла одна ошибка - The key "_username" must be a string, "NULL" given. Почему это происходит?

Я считаю, что имя пользователя не может быть сопоставлено, но почему? AJAX запрос настроен правильно и отправляет _username и _password. Я пытался преобразовать их в строки, но ничего не изменилось.

Форма входа:

<form id="loginForm">
    <div class="form-group">
        <input type="text" class="form-control inner-blue-shadow" id="username" name="_username" placeholder="Username"/>
    </div>
    <div class="form-group">
        <input type="password" class="form-control inner-blue-shadow" id="password" name="_password" placeholder="Password"/>
    </div>
    <div class="text-center"><button type="submit" id="loginButton">Log in</button></div>
</form>

AJAX:

$('#loginForm ').submit(function(e){
    e.preventDefault();
    const form = $("#loginForm");
    const username = $('#username').val();
    const password = $('#password').val();
    axios
        .post('{{path('login')}}', {
            _username: username,
            _password: password
        })
        .then(response => {
            console.log(response.data);
        })
        .catch(error => {
            console.log(error.data);
        });

    return false;
});

Security.yaml

form_login:
    login_path:  login
    check_path:  login
    success_handler: authentication_handler
    failure_handler: authentication_handler

Обработчик:

namespace AppBundle\Security;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\DisabledException;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        return new Response("Some success response...");
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        var_dump($exception);
        if ($exception instanceof DisabledException) {
            return new JsonResponse([
               'message' => 'The account is disabled.'
            ]);
        } else {
            return new JsonResponse([
               'message' => 'Password or username is incorrect.'
            ]);
        }
    }
}

Контроллер входа в систему:

/**
 * @Route("/login", name="login")
 * @return RedirectResponse|Response
 */
public function login()
{
    $user = $this->getUser();
    if($user) {
        $userRoles = $user->getRoles();
        if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
            if(in_array(Role::ROLE_STUDENT, $userRoles)) {
                return $this->redirectToRoute('dashboard_student_home');
            }
        }
    }

    return $this->render('security/login.html.twig');
}

1 Ответ

0 голосов
/ 14 марта 2020

Решение проблемы заключается в том, что в качестве данных мне нужно было передать всю форму:

const form = document.getElementById("loginForm");
const data = new FormData(form);
axios.post('{{path('login')}}', data);

Таким образом, все передается правильно - имя пользователя, пароль и даже CSRF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...