1. 程式人生 > >Spring Security-授權(AccessDecisionManager,AccessDecisionVoter) .

Spring Security-授權(AccessDecisionManager,AccessDecisionVoter) .

AccessDecisionManager完成授權的功能。觀察AccessDecisionManager介面的授權方法
void decide(Authentication authentication, Object object, ConfigAttributeDefinition config)
        throws AccessDeniedException, InsufficientAuthenticationException;
對一次訪問授權,需要傳入三個資訊。
(1)認證過的票據Authentication,確定了誰正在訪問資源。
(2)被訪問的資源object。
(3)訪問資源要求的許可權配置ConfigAttributeDefinition。
從票據中可以獲取認證使用者所擁有的許可權,再對比訪問資源要求的許可權,即可斷定當前認證使用者是否能夠訪問該資源。

Spring Security引入了投票器的概念,真正的授權功能是通過一組AccessDecisionVoter來實現的。
AccessDecisionManager維護著一個AccessDecisionVoter列表參與授權的投票。根據處理投票的策略不同
Spring Security中AccessDecisionManager有3個不同的實現。
(1)UnanimousBased(全票通過):所有投票器都通過才允許訪問資源。
(2)ConsensusBased(少數服從多數):超過一半的投票器通過才允許訪問資源。
(3)AffirmativeBased(一票通過):只要有一個投票器投票通過,就允許訪問資源。

AccessDecisionVoter的vote方法,實現了投票的邏輯。vote方法需要的引數AccessDecisionManager的decide方法
完全相同。實際上AccessDecisionManager的功能就是委託給AccessDecisionVoter實現的。Spring Security中有很多AccessDecisionVoter的實現,最簡單的有RoleVoter。RoleVoter通過將Authentication裡面獲取的許可權資訊,與從
ConfigAttributeDefinition配置的訪問資源需要的許可權對比,來投票通過,或拒絕,或棄權。