Форма входа Symfony добавить дополнительные поля - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении несколько брандмауэров, и для одного из них мне нужно добавить еще одно поле в форму входа symfony.

В дополнение к username и password Iнеобходимо восстановить поле "code", которое пользователь должен заполнить, чтобы войти в систему на этом брандмауэре.

Я видел это в официальной symfony документации:

https://symfony.com/doc/current/security/custom_password_authenticator.html

Но я не понимаю, как обрабатывать новое поле из моей формы.

Я не использую fosuserbundle, и он мне не нужен для моего использования.

Этоsymfony совет по созданию пользовательской формы входа в систему для системы аутентификации

// src/Security/TimeAuthenticator.php
namespace App\Security;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Http\Authentication\SimpleFormAuthenticatorInterface;

class TimeAuthenticator implements SimpleFormAuthenticatorInterface
{
    private $encoder;

    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;
    }

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
    {
        try {
            $user = $userProvider->loadUserByUsername($token->getUsername());
        } catch (UsernameNotFoundException $exception) {
            // CAUTION: this message will be returned to the client
            // (so don't put any un-trusted messages / error strings here)
            throw new CustomUserMessageAuthenticationException('Invalid username or password');
        }

        $currentUser = $token->getUser();

        if ($currentUser instanceof UserInterface) {
            if ($currentUser->getPassword() !== $user->getPassword()) {
                throw new BadCredentialsException('The credentials were changed from another session.');
            }
        } else {
            if ('' === ($givenPassword = $token->getCredentials())) {
                throw new BadCredentialsException('The given password cannot be empty.');
            }
            if (!$this->encoder->isPasswordValid($user, $givenPassword)) {
                throw new BadCredentialsException('The given password is invalid.');
            }
        }

        $currentHour = date('G');
        if ($currentHour < 14 || $currentHour > 16) {
            // CAUTION: this message will be returned to the client
            // (so don't put any un-trusted messages / error strings here)
            throw new CustomUserMessageAuthenticationException(
                'You can only log in between 2 and 4!',
                array(), // Message Data
                412 // HTTP 412 Precondition Failed
            );
        }

        return new UsernamePasswordToken(
            $user,
            $user->getPassword(),
            $providerKey,
            $user->getRoles()
        );
    }

    public function supportsToken(TokenInterface $token, $providerKey)
    {
        return $token instanceof UsernamePasswordToken
            && $token->getProviderKey() === $providerKey;
    }

    public function createToken(Request $request, $username, $password, $providerKey)
    {
        return new UsernamePasswordToken($username, $password, $providerKey);
    }
}

В этом примере не восстанавливаются дополнительные поля.

Это логин формы по умолчанию для symfony аутентификации, который я сейчас использую:

<form action="{{ path('login') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    {#
        If you want to control the URL the user
        is redirected to on success (more details below)
        <input type="hidden" name="_target_path" value="/account" />
    #}

    <button type="submit">login</button>
</form>

Я хотел бы добавить поле в эту форму и восстановить его в своем пользовательском SimpleFormAuthenticatorInterface для выполнения логики аутентификации, мне нужно это дополнительное поле.

Заранее спасибо за совет.

1 Ответ

0 голосов
/ 11 октября 2018

Чтобы получить дополнительные параметры запроса в классе, вы можете ввести RequestStack в вас TimeAuthenticator:

class TimeAuthenticator implements SimpleFormAuthenticatorInterface
{
    private $encoder;

    private $requestStack;

    public function __construct(RequestStack $requestStack, UserPasswordEncoderInterface $encoder)
    {
        $this->requestStack = $requestStack;
        $this->encoder = $encoder;
    }

    public function getOneTimeToken() : ?string
    {
        $this->requestStack->getCurrentRequest()->request->get('yourNewField', null);
    }
    //...

Затем использовать новый метод, чтобы проверить представленное значение для пользователя вauthenticateToken() метод.

Также проверьте систему GuardAuthenticator, так как она больше подходит для ваших нужд.

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