如何在symfony中生成403错误代码


how to generate 403 error code in symfony before filter

我正在尝试使用symfony 2.7的before过滤器来进行身份验证。我的事件监听器如下

class TokenListener {                                                                                                  
protected $dm;                                                                                                     
function __construct() {                                                                                           
}                                                                                                                  
public function setDocumentManager(DocumentManager $dm) {                                                          
    $this->dm = $dm;                                                                                               
}                                                                                                                  
public function onKernelController(FilterControllerEvent $event) {                                                 
    $controller = $event->getController();                                                                         
    if (!is_array($controller)) {                                                                                  
        return;                                                                                                    
    }                                                                                                              
    if ($controller[0] instanceof TokenAuthenticatedController) {                                                  

        $content = $event->getRequest()->getContent();                                                                                                                           
        $json = json_decode($content,true);                                                                        
        $authId = $json['authId'];                                                                                 
        $authToken = $json['authToken'];                                                                           
        echo "authId: {$authId}, authToken: {$authToken}'n";                                                       
        $user = $this->dm->getRepository('HcUserBundle:User')                                                      
            ->createQueryBuilder()                                                                                 
            ->field('authId')->equals($authId)                                                                      
            ->getQuery()                                                                                           
            ->getSingleResult();                                                                                   

        if (!isset($user) || $user->getAuthToken() != $authToken) {                                                
            throw new AccessDeniedException('This action needs a valid token!');                                   
        }                                                                                                         
    }                                                                                                              
}                                                                                                                  
}   

但我收到了500个错误,symfony错误日志显示

未捕获的PHP异常Symfony''Component''Security''Core''Exception''AccessDeniedException:"此操作需要有效的令牌!"

我没有得到403错误,而是尝试使用AccessDeniedHttpException,但遇到了同样的问题,有人知道如何在这里生成403响应吗?感谢

您也可以只返回一个新的响应,将状态代码设置为Codes::HTTP_FORBIDDEN

return new Response("This action needs a valid token!", Codes::HTTP_FORBIDDEN);

编辑:不,这可能不起作用,因为你在一个听众。。。

编辑:你确定它在你的产品环境中也能产生500,而不仅仅是在app_dev 上吗

编辑:它应该以这种方式工作,在侦听器中:

$response = new RedirectResponse("someUri", Codes::HTTP_FORBIDDEN);
$event->setResponse($response);