如何将 Symfony 中的 http_basic 防火墙配置为响应正文中的 return JSON?
How to configure http_basic firewall in Symfony to return JSON in response body?
默认情况下,当您在 Symfony 中配置 http_basic
防火墙时,防火墙将 return “401 Unauthorized
” 和失败请求的空主体。
我想要 return 定制 JSON(例如:{success: false, error: 401}
)。这可能吗?
这是我的配置:
security:
firewalls:
api:
http_basic:
provider: myprovider
您需要使用自定义 AuthenticationEntryPoint
。创建一个 class 实现 AuthenticationEntryPointInterface
:
<?php
namespace AppBundle;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
class CustomBasicAuthenticationEntryPoint implements AuthenticationEntryPointInterface {
private $realmName;
public function __construct($realmName) {
$this->realmName = $realmName;
}
public function start(Request $request, AuthenticationException $authException = null) {
$content = array('success' => false, 'error' => 401);
$response = new Response();
$response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', $this->realmName));
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($content))
->setStatusCode(401);
return $response;
}
}
class 需要作为服务访问,因此将其添加到 services.yml
。将领域作为参数传递。
custom_basic_authentication_entry_point:
class: AppBundle\CustomBasicAuthenticationEntryPoint
arguments: [ main ]
然后您可以在 security.yml
:
中使用它
firewalls:
main:
anonymous: ~
http_basic: ~
entry_point: custom_basic_authentication_entry_point
默认情况下,当您在 Symfony 中配置 http_basic
防火墙时,防火墙将 return “401 Unauthorized
” 和失败请求的空主体。
我想要 return 定制 JSON(例如:{success: false, error: 401}
)。这可能吗?
这是我的配置:
security:
firewalls:
api:
http_basic:
provider: myprovider
您需要使用自定义 AuthenticationEntryPoint
。创建一个 class 实现 AuthenticationEntryPointInterface
:
<?php
namespace AppBundle;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
class CustomBasicAuthenticationEntryPoint implements AuthenticationEntryPointInterface {
private $realmName;
public function __construct($realmName) {
$this->realmName = $realmName;
}
public function start(Request $request, AuthenticationException $authException = null) {
$content = array('success' => false, 'error' => 401);
$response = new Response();
$response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', $this->realmName));
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($content))
->setStatusCode(401);
return $response;
}
}
class 需要作为服务访问,因此将其添加到 services.yml
。将领域作为参数传递。
custom_basic_authentication_entry_point:
class: AppBundle\CustomBasicAuthenticationEntryPoint
arguments: [ main ]
然后您可以在 security.yml
:
firewalls:
main:
anonymous: ~
http_basic: ~
entry_point: custom_basic_authentication_entry_point