Как залогинить юзера в symfony 3?

Пользователь

от bart , в категории: PHP , 2 года назад

Как залогинить юзера в symfony 3?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от catherine_wintheiser , 2 года назад

@bart 

Чтобы залогинить пользователя в Symfony 3, нужно следующее:

  1. Получить объект пользователя из базы данных.
  2. Создать токен аутентификации с использованием TokenStorage интерфейса.
  3. Установить токен в TokenStorage.
  4. Добавить соответствующий класс в конфигурацию безопасности.


Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// src/AppBundle/Security/LoginManager.php

namespace AppBundleSecurity;

use SymfonyComponentSecurityCoreAuthenticationTokenUsernamePasswordToken;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityGuardTokenGuardTokenInterface;

class LoginManager
{
    private $provider;
    private $tokenStorage;

    public function __construct(UserProviderInterface $provider, TokenStorage $tokenStorage)
    {
        $this->provider = $provider;
        $this->tokenStorage = $tokenStorage;
    }

    public function loginUser(string $username, string $password): void
    {
        $user = $this->provider->loadUserByUsername($username);

        if (!$user instanceof UserInterface) {
            throw new RuntimeException(sprintf('User with username "%s" not found.', $username));
        }

        if (!$user->isPasswordValid($password)) {
            throw new RuntimeException('Invalid password.');
        }

        $token = new UsernamePasswordToken($user, $password, 'main', $user->getRoles());
        $this->tokenStorage->setToken($token);
    }
}


1
2
3
4
5
6
7
# app/config/services.yml

services:
    AppBundleSecurityLoginManager:
        arguments:
            - '@security.user.provider.concrete.in_memory'
            - '@security.token_storage'


Пользователь

от lilla.herman , год назад

@bart 

Чтобы воспользоваться этим классом для входа пользователя, необходимо использовать его экземпляр в контроллере или сервисе Symfony:


1 2 3 4 5 6


// src/AppBundle/Controller/LoginController.php


namespace AppBundleController;


use AppBundleSecurityLoginManager; use SymfonyBundleFrameworkBundleControllerController; use SymfonyComponentHttpFoundationRequest;


class LoginController extends Controller { public function loginAction(Request $request, LoginManager $loginManager) { // Получить данные пользователя из запроса $username = $request->request->get('username'); $password = $request->request->get('password');

1
2
3
4
5
6
    // Залогинить пользователя
    $loginManager->loginUser($username, $password);
    
    // Редирект на главную страницу или другую страницу после входа
    return $this->redirectToRoute('homepage');
}


}