Contao 4.8.7 Symfony вход - PullRequest
       30

Contao 4.8.7 Symfony вход

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

Я создал страницу оформления заказа, где можно войти в систему Vue, и во время входа учетные данные отправляются в API с топором ios.

Как получить Symfony для распознать этот логин и также сохранить его в сеансе / готовить ie.

В настоящее время у меня есть следующий код, но я застрял в том, где я должен продолжить. Я смог создать аутентифицированный токен и обнаружил, что GuardHandler должен иметь возможность войти в систему, но я не знаю, как это сделать.

Код ниже:

<?php declare(strict_types=1);

namespace App\Commerce\Controller;

use Contao\FrontendUser;
use Contao\MemberModel;
use Contao\System;
use Contao\Versions;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\InMemoryUserProvider;
use Symfony\Component\Security\Core\User\User;
use Symfony\Component\Security\Core\User\UserChecker;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use function array_key_exists;

/**
 * Handles the FrontendUser routes.*
 * @Route("/api", defaults={"_scope" = "frontend", "_token_check" = false})
 */
class FrontendUserController extends ApiController
{
    /**
     * @var string Uniquely identifies the secured area
     */
    private $providerKey = 'secured_area';

    /**
     * @Route("/user/login/", name="userLogin")
     * @param Request $request
     * @return Response
     */
    public function loginAction(Request $request): Response
    {
        $parameters = null;
        $loggedIn = false;
        if ($content = $request->getContent()) {
            //$parameters = json_decode($content,false);
            $parameters = json_decode($content, true);

            if (count($parameters)) {
                $candidate = MemberModel::findByUsername($parameters['email']);

                if ($candidate) {
                    $loggedIn = password_verify($parameters['password'], $candidate->password);

                    if ($loggedIn) {

                        $unauthenticatedToken = new UsernamePasswordToken(
                            $parameters['email'],
                            $parameters['password'],
                            $this->providerKey
                        );

                        $userProvider = new InMemoryUserProvider(
                            [
                                'emiel.burgman@gmail.com' => [
                                    // password is "123456789"
                                    'password' => '$2y$10$5fBhOQZqBCqaR8YHPL7MCuBZHsS.9hr/.N9ZhPUXwtBVIAndHuBt6',
                                    'roles'    => ['ROLE_MEMBER'],
                                ],
                            ]
                        );

                        // for some extra checks: is account enabled, locked, expired, etc.
                        $userChecker = new UserChecker();

                        $defaultEncoder = new BCryptPasswordEncoder(13);

                        $encoders = [
                            User::class       => $defaultEncoder,
                            FrontendUser::class       => $defaultEncoder,
                        ];

                        // an array of password encoders (see below)
                        $encoderFactory = new EncoderFactory($encoders);

                        $daoProvider = new DaoAuthenticationProvider(
                            $userProvider,
                            $userChecker,
                            $this->providerKey,
                            $encoderFactory
                        );

                        $authenticatedToken = $daoProvider->authenticate($unauthenticatedToken);

                        var_dump($authenticatedToken);

                        $session = System::getContainer()->get('session');

                        $session->set('_security_'.$this->providerKey, serialize($authenticatedToken));
                        $session->save();


                        //$cookie = System::getContainer()->get('cookie');
                        //$cookie = new Cookie($session->getName(), $session->getId());


                        //print_r($daoProvider->authenticate($unauthenticatedToken));

//
//                        var_dump($this->getUser()); exit;
//

//                        $b = $guardHandler->authenticateUserAndHandleSuccess(
//                            $authenticatedToken->getUser(),          // the User object you just created
//                            $request,
//                            $daoProvider, // authenticator whose onAuthenticationSuccess you want to use
//                            'main'          // the name of your firewall in security.yaml
//                        );

                        //var_dump(System::getContainer()->get('security.authorization_checker'));

//                        var_dump($b);
                        #var_dump($authenticatedToken);

                        // var_dump(System::getContainer()->get('contao.security.token_checker')->hasFrontendUser());

                        $loggedIn = $candidate->id;
                    }
                }
            }
        }

        return new JsonResponse($loggedIn);
    }
...