【问题标题】:Symfony2 Access Denied Exception - More Details?Symfony2 访问被拒绝异常 - 更多细节?
【发布时间】:2013-03-19 11:26:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: security symfony acl roles blacklist


    【解决方案1】:

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

    try
    {
      BlacklistedVoterStuff();
    }
    catch( AccessDeniedException e )
    {
      throw AccessDeniedBecauseOfInsufficientRolesException( e.message );
    }
    

    【讨论】:

    • 不幸的是,BlacklistedVoterStuff 是在自己的上下文中执行的,我只为投票者提供实现,然后通过 symfony 将其挂钩到授权进度中。如果我的选民没有返回任何访问权限,安全组件将抛出 AccessDeniedException,而不会提供有关所发生事件的详细信息。
    • 也许你可以让你的选民抛出异常而不是返回没有访问权限 - 它可能会再次冒泡到你的上下文中?
    猜你喜欢
    • 2014-11-19
    • 2013-09-15
    • 2012-05-19
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多