Spring Security应用开发(14) 重要概念之授权相关概念

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。

时间: 2024-12-17 15:39:57

Spring Security应用开发(14) 重要概念之授权相关概念的相关文章

Spring Security应用开发(19)基于方法的授权(三)AOP

本文介绍使用AOP的配置方式来实现基于方法的授权. (1)首先使用Spring Security提供的protect-pointcut进行配置. protect-pointcut结点配置访问符合指定条件的方法锁需要的角色列表. <!-- 使用AOP的方式来定义方法级别的访问控制 --> <sec:global-method-security> <sec:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expre

Spring Security应用开发(21)基于方法的授权(五)使用@Secured注解

Spring Security提供了@Secured注解来实现基于方法的授权控制. @Secured注解可以指定一个字符串数组参数作为value的值,表示当前用户具备这些角色中的任何一个角色即可满足授权条件. (1)启用@Secured注解. <sec:global-method-security secured-annotations="enabled" /> (2)使用Secured注解. //getUserByName()方法可以被具备ROLE_ADMIN或者ROLE

Spring Security应用开发(17)基于方法的授权(一)评估

Spring Security提供了4个用于方法的注解: @PreAuthorize.@PostAuthorize.@PreFilter和@PostFilter.本文介绍前面2个注解. @PreAuthorize 使用Spring Security的表达式来在方法执行之前控制允许执行某个方法. 如果表达式评估结果为false,则该方法不会被执行.@PreAuthorize的表达式通常是对方法的参数进行检查. @PostAuthorize 使用Spring Security的表达式在方法执行之后控

Spring Security应用开发(20)基于方法的授权(四)使用@RolesAllowed注解

Spring Security还提供了一种基于注解的方式来实现基于方法的授权.这就是本文介绍的@RolesAllowed注解.@RolesAllowed是JSR250定义的注解. (1)在spring-security.xml文件中启用JSR250注解支持. <!-- 启用JSR250支持:@RolesAllowed注解 --> <sec:global-method-security jsr250-annotations="enabled" /> (2)在需要授

Spring Security应用开发(18)基于方法的授权(二)过滤

本文将介绍@PreFilter和@PostFilter这两个注解. @PreFilter @PreFilter用于对方法的参数进行过滤.这种情况下参数通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除.如果有多个集合类型的参数,需要使用@PreFilter的一个属性filterTarget来指定要过来的参数的名称. @PostFilter. @PostFilter用于对方法的结果进行过滤.这种情况下返回值通常是集合类型,符合条件的值被保留在集合中,不符合条件的从集合中移除. @

Spring Security OAuth2 开发指南。

官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际上分为: 授权服务 Authorization Service. 资源服务 Resource Service. 虽然这两个提供者有时候可能存在同一个应用程序中,但在Spring Security OAuth中你可以把 他它们各自放在

Spring Security应用开发(04)HTTP basic认证

Spring Security默认是使用form-login表单认证方式. <!-- 默认使用表单认证 --> <sec:form-login /> Spring Security还提供了HTTP basic认证的配置的方式,只要在http标签中使用空的http-basic标签即可启用HTTP basic认证方式. <!-- 角色和URL模式的对应关系 --> <sec:http auto-config="true" use-expressio

Spring Security应用开发(16)基于表达式的访问控制

1.1.1. 通用表达式 Spring Security 使用基于Spring EL的表达式来进行访问控制.内置的表达式如下表所示: 表达式 描述 hasRole(role) 当前主体(principal)是否支持role角色.支持则返回true hasAnyRole(role1,role2) 当前主体是否支持role1,role2中的任意一个角色. hasAuthority(authority) 跟hasRole(role)相似. hasAnyAuthority(authority1,auth

Spring Security应用开发(05)自定义表单认证

Spring Security自动产生的登录页面非常简陋,但是Spring Security提供了丰富的自定义功能. 1.1.1. 密码摘要处理 数据库中的密码字段可以使用SHA摘要算法处理后再保存,而不是以明文保存. mysql> select * from users; +----------+----------+---------+ | username | password | enabled | +----------+----------+---------+ | lisi | 1