如何在过滤

时间:2015-11-05 22:49:36

标签: php symfony event-listener

我正在尝试使用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响应吗?感谢

1 个答案:

答案 0 :(得分:1)

您也可以返回新的回复,将状态代码设置为 *inp+= s1->str();

Codes::HTTP_FORBIDDEN

编辑:因为你在听众中,这可能不起作用......

编辑:你确定它会在你的prod env中产生500,而不仅仅是在app_dev上

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

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