我(想)有一个主控制器,该控制器检查前端提供的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密钥正确与否的两种情况下,我当前使用的设置都可以使用,我理解为什么会这样,但是有一种方法可以指定仅在成功的情况下才可以使用?或另一种做同一件事的聪明方法?我想到了一个根据情况将设置为1
,2
或3
的变量,以后再检查它,但这是无法维护的,并且通常是一种不好的做法。
答案 0 :(得分:-1)
验证用户身份的责任是控制器吗?控制器必须接收一个请求,然后呈现一个响应。
这对于您的案件https://symfonycasts.com/screencast/symfony-rest4/json-web-token
是非常有用的资源