我希望能够设置Cookie onKernelRequest方法,但未设置Cookie,其他所有工作都正常,这里缺少什么?我要实现的是,如果用户未登录并且没有cookie,则他应该看到http基本身份验证标头。如果用户已登录或拥有Cookie,则他可以访问预览域,而不必在http basic auth中输入其用户凭据。
const AUTH_USER = 'myuser';
const AUTH_PW = 'mypass';
public function sendAuthorizationHeader()
{
header('WWW-Authenticate: Basic realm="Preview Domain"');
header('HTTP/1.0 401 Unauthorized');
die();
}
public function onKernelRequest(GetResponseEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
$host = $request->getHost();
$loginSuccessful = false;
// check if we are on a preview domain
if (preg_match('/^preview-\d+/', $host)) {
$user = $request->getUser();
$cookie = $request->cookies->get('preview_user');
$phpAuthUser = $request->server->get('PHP_AUTH_USER');
$phpAuthPw = $request->server->get('PHP_AUTH_PW');
if (isset($phpAuthUser) && isset($phpAuthPw)) {
if ($phpAuthUser == self::AUTH_USER && $phpAuthPw == self::AUTH_PW) {
$loginSuccessful = true;
}
} else if ($user === null && $cookie === null) {
$this->sendAuthorizationHeader();
}
if (!$loginSuccessful) {
$this->sendAuthorizationHeader();
} else {
$cookie = new Cookie('preview_user', true, 86400, '/', null, false, false);
$response = new Response();
$response->headers->setCookie($cookie);
$response->sendHeaders();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在响应对象上设置cookie只会将cookie添加到该请求中。您需要返回相同的响应对象,因此Symfony会将其呈现回客户端。自己渲染它不是一个好主意,因为可能稍后会发送内容,并且它实际上不是可测试的。
在kernel.response事件侦听器中更容易完成此操作,因为您已经在那里有了响应。记住要使用您的应用程序创建的响应。不要自己创建它。
如果您根据请求期间也应使用的逻辑设置cookie,则可以将其拆分为两个事件侦听器方法。一个将在上设置request属性kernel.request,另一个将在上将响应的cookie设置为kernel.response:
public function onKernelRequest(GetResponseEvent $event)
{
// your logic goes here. calculate the $result
// ...
$event->getRequest()->attributes->set('my_result', $result);
}
public function onKernelResponse(FilterResponseEvent $event)
{
$response = $event->getResponse();
$request = $event->getRequest();
$myResult = $request->attributes->get('my_result');
$cookie = new Cookie(/* ... */);
$response->headers->setCookie($cookie);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2671 次 |
| 最近记录: |