thomas0yang 2019-06-26
@(技术-架构)[源码, 权限, Security, Oauth2]
Oauth2 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。Spring-Security-Oauth2是基于Spring-Security安全框架实现Oauth2的标准授权验证,以下是对Spring-Security-Oauth2的源代码分析。
Spring-Security-Core:封装了验收、授权流程核心基础类。
Spring-Security-Web:是基于HTTP实现对安全验证的封装。
Spring-Security-Config:实现了Spring Security命名空间的配置。
Spring-Security-Oauth2:通过Spring Security框架,实现Oauth2标准验证流程。
org.springframework.security.access
权限访问处理层,包含了访问权限annotation
的配置注解,访问验证的事event
,访问权限配置的表达式解析expression
,对访问权限的方法拦截器intercept
,权限方法注解的实现method
,验证的post过程prepost
,还有核心的授权方法与管理vote
。
核心类访问决策器AccessDecisionVoter
AbstractAclVoter
:提供编写域对象ACL选项的帮助方法,没有绑定到任何特定的ACL系统。AclEntryVoter
:给定一个作为方法参数传递的域对象实例,确保类要绑定合适的权限AclService。AuthenticatedVoter
:对 IS_AUTHENTICATED_FULLY或IS_AUTHENTICATED_REMEMBERED或 IS_AUTHENTICATED_ANONYMOUSLY检查与验证。ClientScopeVoter
:[Oauth2] 检查是否在客户端的权限范围内。Jsr250Voter
:通过JSR-250配置的注解进行授权。PreInvocationAuthorizationAdviceVoter
:使用@PreFilter和@PreAuthorize注释生成的PreInvocationAuthorizationAdvice来授权RoleVoter
:匹配默认的前缀字符串是ROLE_的ConfigAttribute,如果匹配到则授权,针对角色的授权。RoleHierarchyVoter
:扩展RoleVoter使用RoleHierarchy定义来确定在授权给当前用户的角色。ScopeVoter
:匹配默认的前缀字符串是SCOPE_的ConfigAttribute,如果匹配到则授权,如:授权范围SCOPE_READ、SCOPE_WRITE。
int ACCESS_GRANTED = 1; //决策结果-允许 int ACCESS_ABSTAIN = 0; //决策结果-放弃 int ACCESS_DENIED = -1; //决策结果-拒绝 //决策方法 int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes);
核心类访问控制决策管理AccessDecisionManager
AffirmativeBased
实现类轮询所有配置 AccessDecisionVoter的,并且如果有的话AccessDecisionVoter肯定地授予访问权限。ConsensusBased
实现类轮询所有配置 AccessDecisionVoter的,并且如果AccessDecisionVoter肯定大于否定的数量的话就授予访问权限,相等的话就看AbstractAccessDecisionManager.isAllowIfAllAbstainDecisions()方法(默认为false)。UnanimousBased
实现类轮询所有配置AccessDecisionVoter的每个配置,并且如果AccessDecisionVoter全部是肯定才能授予访问权限。
//决策方法,如果决策不通过就抛出异常 void decide(Authentication authentication, Object object,Collection<ConfigAttribute> configAttributes) throws AccessDeniedException,InsufficientAuthenticationException;
org.springframework.security.authentication
权限认证处理层,实现了对权限的管理和认证,dao
封装了用户信息的访问,encoding
封装了对用户密码加密的处理,event
实现对授权验证的成功、失败等事件,jaas
是对Java Jaas授权API的封装,rcp
提供了远程授权验证与管理。