@(技术-架构)[源码, 权限, Security, Oauth2]spring
Oauth2 是一个开放标准,容许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。Spring-Security-Oauth2是基于Spring-Security安全框架实现Oauth2的标准受权验证,如下是对Spring-Security-Oauth2的源代码分析。express
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所有是确定才能授予访问权限。ide
//决策方法,若是决策不经过就抛出异常 void decide(Authentication authentication, Object object,Collection<ConfigAttribute> configAttributes) throws AccessDeniedException,InsufficientAuthenticationException;
org.springframework.security.authentication
权限认证处理层,实现了对权限的管理和认证,dao
封装了用户信息的访问,encoding
封装了对用户密码加密的处理,event
实现对受权验证的成功、失败等事件,jaas
是对Java Jaas受权API的封装,rcp
提供了远程受权验证与管理。post