1.1.1. Secure Object
Secure Object指的是一个Method Invovation 或者一个URL资源。
1.1.2. GrantedAuthority
GrantedAuthority用于表达指定的用户获得的权限(即角色名称)。
public interface GrantedAuthority extends Serializable { //返回一个表达已经经过授权的字符串。 //如果不符合授权条件则返回null。 String getAuthority(); }
1.1.3. AccessDecisionManager
AccessDecisionManager是Spring Security提供的访问决策管理器接口。
public interface AccessDecisionManager { //执行决策过程,最终赞成则不抛出异常,最终否决则抛出异常。 void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException; //是否支持指定的安全对象属性。 boolean supports(ConfigAttribute attribute); //是否支持指定的安全对象类型。 boolean supports(Class<?> clazz); }
在Spring Security的访问决策管理器模型中,一个访问决策管理器可以配置多个决策投票器。对于同一个访问请求,可能不同的决策投票器的投票结果并不相同,这时需要指定一种策略来根据这些投票结果进行最终决策。Spring Security中提供了三种内置的策略:
AffirmativeBased
只要有一个投票器投了赞成票,则最终决策为赞成。如果没有赞成票,但是有一个或多个否决票,则最终决策为否决。
UnanimousBased
只有由一个投票器投了否决票,则最终决策为否决。如果没有否决票,但是有一个或多个赞成票,则最终结果为赞成。
ConsensusBased
如果赞成票的个数大于否决票的个数,则最终决策为赞成。如果赞成票的个数小于否决票,则最终决策为否决。如果赞成票和否决票都存在,而且个数相等,则根据一个参数来决定最终结果,此参数默认情况下认为最终结果为赞成。
在上述三种策略中,如果既没有赞成票也没有否决票,则根据弃权票来进行决策,有另外的参数来决定弃权票是否参与决策,此参数默认情况下认为最终结果为否决。
1.1.4. Voter
AccessDecisionVoter是Spring Security提供的访问决策投票器接口。
Spring Security提供了以下几种内置的投票器。
public interface AccessDecisionVoter<S> { int ACCESS_GRANTED = 1; //赞成票。 int ACCESS_ABSTAIN = 0; //弃权票。 int ACCESS_DENIED = -1; //否决票。 boolean supports(ConfigAttribute attribute); boolean supports(Class<?> clazz); int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes); }
RoleVoter: 基于角色的投票器。
此时安全对象属性是可以访问该安全对象的角色。
如果用户拥有的角色中存在任何一个角色和安全对象属性集合中的任何一个匹配,则投赞成票。安全对象属性集合为空,或者投票器对所有安全对象属性都不支持,则投弃权票。如果支持任何一个安全对象属性,而没有匹配其中任何一个属性,则投否决票。
AuthenticatedVoter:基于认证的投票器。
认证有三种安全级别:
IS_AUTHENTICATED_FULLY:完整认证。
级别最高,权限最大。比如通过直接输入用户名和密码。
IS_AUTHENTICATED_REMEMBERED:记住我认证。
级别居中,权限居中。比如通过在登录时在“remember me”复选框上打钩后登录,关闭浏览器后再次访问有关页面时不必输入密码直接通过验证。
IS_AUTHENTICATED_ANONYMOUSLY:匿名认证。
级别最低,权限最低。比如一些页面允许在不登录的情况下就可以正常访问。
决策过程如下:
如果安全对象属性中有一个要求完整认证,而当前处于已通过完整认证级别,则投赞成票。
如果安全对象属性中有一个要求记住我认证,而当前处于已通过记住我认证级别,或者完整认证级别,则投赞成票。
如果安全对象属性中有一个要求匿名认证,而当前处于已通过匿名认证级别,或者记住我认证级别,或者完整认证级别,则投赞成票。
如果本投票器支持至少一个安全对象属性,而当前所处安全认证级别都不符合这些安全对象属性的要求,则投否决票。
如果安全对象属性集合为空,或者不支持其中的任何一个安全对象属性,则投弃权票。
RoleHierarchyVoter:基于角色的分层投票器。
此类继承自RoleVote类。本质是基于角色的投票器,增加了对树状结构的角色层次的支持。
可以描述角色A同时拥有角色A1和A2的所有权限,而A1同时拥有角色A11和角色A12的所有权限这种场景。
在Spring Security 的web相关包中还提供了以下投票器:
WebExpressionVoter:基于Web表达式的投票器。
这里的Web表达式是类似于下面配置中的access属性中的值的表达式:
<http> <intercept-url pattern="/admin*" access="hasRole(‘admin‘) and hasIpAddress(‘192.168.1.0/24‘)"/> </http>
此时的安全对象属性是WebExpressionConfigAttribute。