关于UnanimousBased AccessDecisionManager访问授权规则的疑问
UnanimousBased AccessDecisionManager:仅一名投票者弃权、其余均允许时会抛出AccessDeniedException吗?
这个问题问得很好!结合《Pro Spring Security》里的说明和Spring Security的实际逻辑,我们来理清楚这个场景的处理方式:
首先回顾书中提到的核心规则:
UnanimousBased
正如你所想,该访问决策管理器仅在所有配置的投票者均投票允许访问资源时,才会授予访问权限。若任一投票者投票拒绝访问,将抛出AccessDeniedException。“全部弃权”的情况处理方式与其他AccessDecisionManager实现一致。
针对你说的「除一名投票者弃权外,其余均投允许」的场景,实际处理逻辑是这样的:
- 没有拒绝票,触发异常的前提不成立:
UnanimousBased只有在存在任意一张拒绝票时才会抛出AccessDeniedException,这里显然没有拒绝票,所以不会直接触发异常。 - 弃权票不影响「存在允许票」的判定:书中说的「所有配置的投票者均投票允许」其实是一种简化表述,真实逻辑是「没有拒绝票,且至少存在一张明确的允许票」。弃权票属于中立票,既不反对也不赞成,所以只要有其他投票者投了允许,就满足授权的核心条件。
所以结论是:这种场景下不会抛出AccessDeniedException,访问会被正常授予。
只有当所有投票者都弃权(没有允许票也没有拒绝票)时,才会按照其他AccessDecisionManager的一致逻辑处理——通常是拒绝访问,因为没有明确的授权许可。
内容的提问来源于stack exchange,提问作者fspasovski
相关产品推荐
相关产品推荐

