0

我有以下问题:在我的 symfony 2 应用程序中,我有一个名为“ClientIpVoter”的选民,它检查客户端 IP 是否被列入黑名单(http://symfony.com/doc/2.0/cookbook/security/voters.html)。如果 ip 被列入黑名单,则安全组件会引发 AccessDeniedException。

安全组件的其他部分也会抛出 AccessDeniedException,例如,如果用户没有正确的角色。

现在我的问题是,我想知道为什么抛出 AccessDeniedException,以便做不同的事情。例如显示一条消息,或者(如果由于角色不足而引发 AccessDeniedException),将用户重定向到一个页面,他可以在其中确认他的帐户或电子邮件。

但是 AccessDeniedException 不包含有关授权问题来源的任何信息。你将如何实现这一点?

4

1 回答 1

0

您可以捕获为列入黑名单的 IP 引发的 AccessDeniedException,将其包装在您自己的自定义异常中,该异常会添加额外的信息,例如 AccessDeniedBecauseOfInsufficientRolesException,然后再次抛出该异常。伪代码:

try
{
  BlacklistedVoterStuff();
}
catch( AccessDeniedException e )
{
  throw AccessDeniedBecauseOfInsufficientRolesException( e.message );
}
于 2013-03-19T11:51:15.927 回答