我正在尝试学习Symfony 2并遇到一个奇怪的问题,我不理解异常捕获。
我正在尝试在Symfony网站上实现the API Authentication的修改版本,但使用$ _SERVER ['REMOTE_USER']代替(因为这是IIS将Windows身份验证用户传递给PHP的地方)。
当我按照教程操作时,可以抛出UsernameNotFoundException
和AuthenticationException
,但是当我使用时,我得到BadCredentialsException
(在SecurityContext中找不到令牌) )。
我可以看到我的日志中抛出了其他异常,但它们似乎被内核捕获并且代码执行一直持续到请求令牌并且不存在,这会抛出BadCredentialsException
isn'抓住并最终使系统出错。
据我所知:
PreAuthenticationInterface
中,我尝试使用已知用户检查$ _SERVER ['REMOTE_USER']中的用户名。UsernameNotFoundException
并被内核捕获。由于抛出异常就像return
一样,因此执行后没有代码,也没有返回任何代码。BadCredentialsException
。BadCredentialsException
,最终触发kernel.exception事件,Symfony返回500错误。这一切都很好,但我实际上想回复UsernameNotFoundException
并向用户显示信息性消息。
我已经尝试过创建一个自定义的EventListener,但我只能挂钩到kernel.exception
事件,并且不会触发捕获的异常,因此我只看到BadCredentialsException
。
那么我如何实际回复UsernameNotFoundException
或AuthenticationException
而不是抓住并隐藏它们?
答案 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)