我想强制用户使用HTTPS而不是HTTP,但只能在身份验证之后使用。我发现的唯一选择是基于每个控制器/方法强制HTTPS。匿名用户应该只使用HTTP。
如何仅为经过身份验证的用户设置force-HTTPS,并强制不对我的捆绑包中所有控制器中未经身份验证的用户使用HTTPS?
再次 - 这不是关于禁用授权页面的HTTPS。
我想对经过身份验证和未经身份验证的用户使用所有相同的控制器,但强制登录的用户使用HTTPS,以及那些不使用HTTP的用户。在用户通过身份验证时,基本上为所有控制器添加HTTPS要求。
这个问题是Symfony 2具体的。我想用Symfony机制来做。我知道如何检测这个东西,但它会打破Twig链接。 Symfony可以自动切换到HTTPS,我只想知道如何在每个用户角色的基础上进行,而不是基于每个控制器。
答案 0 :(得分:10)
有人会认为访问控制器会为我们这样做:
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()));
}
}
}
}
在service:
下的config.yml中定义监听器myapp.request.listener:
class: MyApp\MyBundle\EventListener\RequestListener
tags:
- { name: kernel.event_listener, event: kernel.request }
有关事件等的详细信息,请参阅Symfony Internals。
答案 1 :(得分:2)
在Symfony 2.0.11中,我收到重定向错误。 为了解决这个问题,我在听众中注释了以下几行。
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()));
}
}
}
}