Как аутентифицировать анонимного посетителя (пользователя) с помощью хеша в Symfony 4? - PullRequest
0 голосов
/ 14 ноября 2018

У нас есть сайт, где люди могут войти, используя hash. У нас нет отдельных пользователей. Каждый, кто имеет действительный хэш , может войти в систему, и не важно различать, кто вошел в систему.

Я уже создал форму для получения хэша в контроллере. Вот упрощенный код:

public function index(Request $request) {
    if ($request->isMethod('post')) {
        $token = $request->request->get('token');
        $hash = $request->request->get('hash');

        if ($this->isCsrfTokenValid('login', $token) && $this->isHashValid($hash)) {
            // redirect
        }

        // fail
    }

    return $this->render('login.html.twig', []);
}

Теперь в $this->isHashValid() я уже могу сказать, действителен ли хеш. Но я не уверен, как authenticate посетителю вручную:

isHashValid($hash) {
    // pseudo-check for the question
    if (in_array($hash, $hashes) {
        // How to authenticate the user?
        return true;
    }

    return false;
}

Я также обновил security.yaml , чтобы перенаправить unauthenticated посетителей на стартовую страницу, которая уже работает:

security:
    providers:
        in_memory: { memory: ~ }
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true

            form_login:
                login_path: '/'

    access_control:
        - { path: ^/secured, allow_if: "is_authenticated()" }

Итак, мой вопрос: как я могу аутентифицироваться, а затем программно выйти из системы посетителя в Symfoy 4?

Нужно ли мне создавать класс User, даже если у нас нет " реальных пользователей " в классическом смысле?

1 Ответ

0 голосов
/ 14 ноября 2018

Вам нужно будет создать User, реализующий UserInterface, но это может быть базовый класс, который не требует установки каких-либо значений. Просто убедитесь, что getRoles() возвращает не менее ["ROLE_USER"], а все остальное должно быть в порядке, чтобы просто возвращать фиктивные данные или нулевые значения.

Аутентификация может быть решена несколькими способами.

GuardAuthenticator кажется хорошим решением: https://symfony.com/doc/current/security/guard_authentication.html#step-2-create-the-authenticator-class

FormLoginAuthenticator очень похож, но некоторые методы автоматически обрабатываются на основе использования формы входа в систему, поэтому реализовать ее немного проще: https://symfony.com/doc/current/security/form_login_setup.html

В обоих случаях вы можете сделать это в основном следующим образом: getCredentials вы извлекаете данные из запроса, в getUser вы возвращаете свой фиктивный пользовательский объект, а в checkCredentials вы вызываете свой метод isHashValid, остальные должны говорите сами за себя.

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