Symfony / Api platorm / JWT получает текущего пользователя после входа в систему

#symfony #jwt #api-platform.com

#symfony #jwt #api-platform.com

Вопрос:

Доброе утро всем, пожалуйста, мне нужна помощь. Я использую аутентификацию JWT, и все работает хорошо.Но моя проблема заключается в том, чтобы вернуть текущего пользователя после входа в систему. Я видел в документации, что я могу создать контроллер для этого, но после этого я получаю ошибку параметра id, который не указан. Вот мой контроллер, связанный с объектом user

 // api/src/Controller/GetMeAction.php

namespace AppController;

use AppEntityUser;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentSecurityCoreSecurity;

class GetMeAction
{
    /**
     * @param Security
     */
    private $_security;

    public function __construct(Security $security)
    {
        $this->_security = $security;
    }

    /**
     * @Route(
     *     name="get_me",
     *     path="get/me",
     *     methods={"GET"},
     *     defaults={
     *         "_api_resource_class"=User::class,
     *         "_api_item_operation_name"="get_me"
     *     }
     * )
     */
    public function __invoke(Request $request): User
    {
        return $this->_security->getUser();
    }
}
 

Комментарии:

1. измените _api_item_operation_name на _api_collection_operation_name .

2. это решит проблему . Спасибо yivi

Ответ №1:

Предыдущий ответ правильный, но вы забыли расширить свой контроллер из абстрактного:

 namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;

class AdminController extends AbstractController
{
}
 

Если вы хотите получить пользователя в службе, вы можете ввести SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface в свой __construct()

и вы можете получить от пользователя лайк:

 public function getUser(): ?User
{
    $token = $this->tokenStorage->getToken();

    if (!$token) {
        return null;
    }

    $user = $token->getUser();

    if (!$user instanceof User) {
        return null;
    }

    return $user;
}
 

Ответ №2:

Я использую symfony 5.3, я хотел использовать нормализацию платформы api и операцию элемента «get», чтобы сохранить всю пользовательскую конфигурацию, безопасность, сервисы… Поэтому я использовал forward() метод в контроллере :

 /**
 * @Route("/api/user/me", name="get_me")
 */
public function getMe(): Response
{
    $router = $this->get('router')->getRouteCollection()->get('api_users_get_item');
    $defaults = $router->getDefaults();
    return $this->forward($router->getDefault('_controller'), array_merge($defaults, [ 'id' => $this->getUser()->getId()]));
}