来自Symfony 2.3安全文档:
如果拒绝访问,系统将尝试验证用户(如果尚未验证)(例如,将用户重定向到登录页面).如果用户已登录,将显示403"访问被拒绝"错误页面.有关更多信息,请参见如何自定义错误页面.
我目前正在使用access_control几条路线的规则.我想通知匿名用户,如果他们被重定向到登录路线,并显示" 您必须登录才能访问该页面 " 的消息.我已经阅读了几次安全文档并且没有找到与此相关的任何内容.我忽略了什么吗?
如果没有,只有当他们被重定向到登录时(即不是他们只是未经授权的角色),当他们被access_control规则停止时通知用户的最佳方式是什么?
编辑:
为了澄清,我特别询问如何检查重定向是否是由access_control规则引起的(如果可能的话,最好是在树枝上).
我需要在注销时修改我的用户对象.为此,我有一个security.yml,其中包含以下内容(除其他外) -
#...
logout:
success_handler: my.logout_success_handler
target: /
#...
Run Code Online (Sandbox Code Playgroud)
...这定义了一个注销成功处理程序,它在services.yml中定义,如下所示 -
my.security.logout_success_handler:
class: My\Security\LogoutSuccessHandler
arguments: ["@security.context", "@doctrine.orm.default_entity_manager"]
Run Code Online (Sandbox Code Playgroud)
...最后,我的处理程序的业务端是这样的 -
// ...
public function onLogoutSuccess(Request $request)
{
$user = $this->securityContext->getToken()->getUser();
// ... do stuff with the user object....
$this->em->flush();
// now what?
}
// ...
Run Code Online (Sandbox Code Playgroud)
那么,它说"现在是什么?" 我知道我需要返回一个Response对象.理想情况下,我希望该响应对象将用户重定向到security.yml中logout.target中定义的任何内容.
有一种简单的方法可以查询吗?或者,更好的是,还有另一种做这种事情的方法,它不需要我参与请求/响应对象吗?
谢谢
我想在AccessDeniedException的情况下自定义Symfony2的行为.如果引发异常的HTTP请求是XMLHTTPRequest,那么我使用JSON回复,否则我会在登录页面中生成302.
这是我的实施.该日志显示在AccessDeniedException之后永远不会调用AccessDeneidHandler.我错过了什么?
#security.yml
firewalls:
secured_area:
access_denied_handler: kernel.listener.access_denied.handler
Run Code Online (Sandbox Code Playgroud)
#config.yml
kernel.listener.access_denied.handler:
class: NoaLisa\Bundle\OVMBundle\DependencyInjection\AccessDeniedHandler
tags:
- { name: kernel.event_listener, event: security.kernel_response, method: handle}
Run Code Online (Sandbox Code Playgroud)
#AccessDeniedHandler
class AccessDeniedHandler implements AccessDeniedHandlerInterface{
function handle(Request $request, AccessDeniedException $accessDeniedException){
if ($request->isXmlHttpRequest()) {
$response = new Response(json_encode(array('status' => 'protected')));
return $response;
}
else {
return new RedirectResponse($this->router->generate('login'));
}
}
}
Run Code Online (Sandbox Code Playgroud)