人們會認爲存取控制器會爲我們做這一點:
access_control:
- { role: ROLE_USER, requires_channel: https }
- { role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http }
但,不......我認爲這將是一個非常不錯的功能,但。
在這種情況下,我們可以請求收聽使用內核事件一起砍東西:
namespace YourBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
class RequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
// force ssl based on authentication
if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
if (!$request->isSecure()) {
$request->server->set('HTTPS', true);
$request->server->set('SERVER_PORT', 443);
$event->setResponse(new RedirectResponse($request->getUri()));
}
} else {
if ($request->isSecure()) {
$request->server->set('HTTPS', false);
$request->server->set('SERVER_PORT', 80);
$event->setResponse(new RedirectResponse($request->getUri()));
}
}
}
}
定義你的聽衆在config.yml下服務:
myapp.request.listener:
class: MyApp\MyBundle\EventListener\RequestListener
tags:
- { name: kernel.event_listener, event: kernel.request }
見Symfony Internals的細節事件等。
你有問題嗎? – JJJ
未使用HTTPS進行身份驗證是一個不好的決定。這意味着發送/接收的數據是純文本,任何訪問客戶端和服務器之間路由中任何計算機的人都能夠讀取數據包並收集憑據(用戶,密碼,cookie等)。有沒有不使用SSL進行身份驗證的特殊原因? – jweyrich
@jweyrich這不是問題。我希望用戶在授權之後(這是外部btw)對所有後續頁面使用https,併爲未經授權的用戶禁用https。 –