Symfony - Установите TokenController с помощью LexikJWTAuthenticationBundle - PullRequest
0 голосов
/ 26 октября 2018

Я использую LexikJWTAuthenticationBundle https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md#installation

Я настраиваю свой контроллер для получения токена:

class TokenController extends AbstractController
{
    /**
     * @Route("/api/token", name="token", methods={"POST"})
     * @param Request $request
     * @param JWTEncoderInterface $JWTEncoder
     * @return JsonResponse
     * @throws \Lexik\Bundle\JWTAuthenticationBundle\Exception\JWTEncodeFailureException
     */
    public function token(Request $request, JWTEncoderInterface $JWTEncoder)
    {
        $user = $this->getDoctrine()->getRepository(User::class)->findOneBy([
            'email' => $request->getUser(),
        ]);

        if (!$user) {
            throw $this->createNotFoundException('User Not Found');
        }

        $isValid = $this->get('security.password_encoder')
            ->isPasswordValid($user, $request->getPassword());
        if (!$isValid) {
            throw new BadCredentialsException();
        }
        $token = $JWTEncoder->encode([
                'email' => $user->getEmail(),
                'exp' => time() + 3600 // 1 hour expiration
            ]);

        return new JsonResponse(['token' => $token]);
    }
}

Но у меня есть эта ошибка:

Служба "security.password_encoder" не найдена: даже если она существует в контейнере приложения, контейнер внутри "App \ Controller \ TokenController" - это меньший локатор службы, который знает только о "doctrine", "form.factory", «http_kernel», «parameter_bag», «request_stack», «router», «security.authorization_checker», «security.csrf.token_manager», «security.token_storage», «serializer», «session» и «twig».Если вам не нужна дополнительная лень, попробуйте вместо этого использовать внедрение зависимостей.В противном случае вам нужно объявить это с помощью «TokenController :: getSubscribeedServices ()».

Я использую инъекцию зависимостей, и вот мой сервис conf

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

Где проблема?

1 Ответ

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

Вы расширяете с AbstractController, используя этот контроллер, услуги, к которым вы обращаетесь с помощью $this->get(), будут ограничены. Чтобы получить доступ к службе кодирования паролей, вы можете ввести Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface в действие вашего контроллера или через конструктор класса контроллера.

private $passwordEncoder;

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

$this->passwordEncoder->isPasswordValid()
...

Или вы можете расширить с Symfony\Bundle\FrameworkBundle\Controller\Controller для полного доступа к контейнеру. $this->get('security.password_encoder') должно работать с этим.

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