Symfony 4,如何基于JSON响应采取身份验证操作?

时间:2019-06-14 18:41:10

标签: symfony symfony4

我(想)有一个主控制器,该控制器检查前端提供的API密钥是否正确,然后才执行一些操作。这是通用控制器:

<?php


namespace App\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;


class AuthenticationController extends AbstractController
{

    /**
     * @param Request $request
     * @return JsonResponse
     */
    public function checkAuthentication(Request $request)
    {

        if (empty($request->headers->get('api-key'))) {
            return new JsonResponse(['error' => 'Please provide an API_key'], 401);
        }

        if ($request->headers->get('api-key') !== $_ENV['API_KEY']) {
            return new JsonResponse(['error' => 'Invalid API key'], 401);
        }

        return new JsonResponse(['success' => 'This is a valid API key, Authentication succeeded'], 200);
    }
}

在另一个类中,我想调用此checkAuthentication方法,仅当返回消息'This is a valid API key, Authentication succeeded'时,我才想采取措施。

所以我现在所拥有的是:

<?php


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Controller\AuthenticationController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;

class SomeEntityController extends AbstractController
{

    private $entityManager;

    /**
     * ApiKeyAuthenticatorService constructor.
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * @Route("/Some/Uri", methods={"GET"})
     * @param AuthenticationController $apiKeyAuthenticator
     * @param Request $request
     * @return JsonResponse
     */
    public function AuthenticateAPI(AuthenticationController $apiKeyAuthenticator, Request $request)
    {

        $AuthenticatorObject = $apiKeyAuthenticator->checkAuthentication($request);
        if($AuthenticatorObject){ //what to do here?
            return new JsonResponse($this->entityManager->getRepository('App\Entity\SomeEntity')->findAll()); 
        }
        return $AuthenticatorObject;
    }

}

在提供的API密钥正确与否的两种情况下,我当前使用的设置都可以使用,我理解为什么会这样,但是有一种方法可以指定仅在成功的情况下才可以使用?或另一种做同一件事的聪明方法?我想到了一个根据情况将设置为123的变量,以后再检查它,但这是无法维护的,并且通常是一种不好的做法。

1 个答案:

答案 0 :(得分:-1)

验证用户身份的责任是控制器吗?控制器必须接收一个请求,然后呈现一个响应。

这对于您的案件https://symfonycasts.com/screencast/symfony-rest4/json-web-token

是非常有用的资源