我正在尝试为symfony2安装我的安全设备,到目前为止我已经开始工作,但现在我需要做一些更奇特的事情。我目前正在使用处理PreAuthentication的所有内容(我使用第三方组件进行登录和会话管理)。该部分与JMS安全捆绑包一起工作很好。
现在我想要抓住投掷403s的用户,以便我可以将它们转发到我正在使用的第三方组件的登录页面。我认为我最好的办法是在异常监听器中添加一个异常处理程序。我正在查看AccessDeniedHandlerInterface。
编辑: 我最终做了类似的事情。我创建了一个在kernel.exception事件上提示的服务。 services.yml看起来像这样:
services:
kernel.listener.accessDenied:
class: Fully\Qualified\Namespace\Path\To\Class
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onAccessDeniedException }
和它自己的课程:
<?php
namespace Fully\Qualified\Namespace\Path\To;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent,
Symfony\Component\HttpFoundation\Response,
Symfony\Component\Security\Core\Exception\AccessDeniedException;
class Class
{
public function onAccessDeniedException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
//Get the root cause of the exception.
while (null !== $exception->getPrevious()) {
$exception = $exception->getPrevious();
}
if ($exception instanceof AccessDeniedException) {
//Forward to third-party.
}
}
}
答案 0 :(得分:21)
这听起来很对。
或者,如果您对AccessDeniedException特别感兴趣,还可以在access_denied_handler
中的防火墙内定义security.yml
:
security:
firewalls:
my_firewall:
# ...
access_denied_handler: kernel.listener.access_denied.handler
# ...
然后在services.xml
或同等内容中定义您的服务:
<parameters>
<parameter key="kernel.listener.security.class">Path\To\Your\Class</parameter>
</parameters>
<service id="kernel.listener.access_denied.handler" class="%kernel.listener.security.class%">
<tag name="kernel.event_listener" event="security.kernel_response" method="handle" />
</service>
处理程序类:
use \Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
class MyAccessDeniedHandler implements AccessDeniedHandlerInterface
{
public function handle(Request $request, AccessDeniedException $accessDeniedException)
{
// do something with your exception and return Response object (plain message of rendered template)
}
}
您可以在此处找到Symfony2的完整安全参考:http://symfony.com/doc/2.8/reference/configuration/security.html