Symfony2异常捕捉混乱

时间:2014-02-10 13:37:52

标签: php symfony exception authentication

我正在尝试学习Symfony 2并遇到一个奇怪的问题,我不理解异常捕获。

我正在尝试在Symfony网站上实现the API Authentication的修改版本,但使用$ _SERVER ['REMOTE_USER']代替(因为这是IIS将Windows身份验证用户传递给PHP的地方)。

当我按照教程操作时,可以抛出UsernameNotFoundExceptionAuthenticationException,但是当我使用时,我得到BadCredentialsException(在SecurityContext中找不到令牌) )。

我可以看到我的日志中抛出了其他异常,但它们似乎被内核捕获并且代码执行一直持续到请求令牌并且不存在,这会抛出BadCredentialsException isn'抓住并最终使系统出错。

据我所知:

  1. PreAuthenticationInterface中,我尝试使用已知用户检查$ _SERVER ['REMOTE_USER']中的用户名。
  2. 找不到用户名(实际上与字符串不匹配 - 我还没有开始集成数据库)
  3. 我抛出UsernameNotFoundException并被内核捕获。由于抛出异常就像return一样,因此执行后没有代码,也没有返回任何代码。
  4. 由于未返回任何内容,因此未创建任何身份验证令牌。
  5. 防火墙尝试从安全上下文中获取(不存在的)令牌,但它不能抛出BadCredentialsException
  6. 未捕获BadCredentialsException,最终触发kernel.exception事件,Symfony返回500错误。
  7. 这一切都很好,但我实际上想回复UsernameNotFoundException并向用户显示信息性消息。

    我已经尝试过创建一个自定义的EventListener,但我只能挂钩到kernel.exception事件,并且不会触发捕获的异常,因此我只看到BadCredentialsException

    那么我如何实际回复UsernameNotFoundExceptionAuthenticationException而不是抓住并隐藏它们?

1 个答案:

答案 0 :(得分:0)

BTW:你不应该直接访问$ _SERVER。相反,你应该使用Request对象。它还包含$ _SERVER值。 (详情:http://symfony.com/doc/current/components/http_foundation/introduction.html)。

您是否尝试告诉用户以下其中一项:

  • 密码错误
  • 错误的用户名

你应该避免它。 UsernameNotFoundException 适用于提供商工作人员。如果您返回确切的信息,那么您将提供“我有没有这个用户”的信息。如果电子邮件作为用户名,您将向世界公开。使用正确的HTTP状态代码取消授权应该足够了(这应该通过以下方式完成:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/Firewall/ExceptionListener.php