SpringSocial 基础使用和介绍

110 阅读7分钟

SpringSocial简介

Spring Security认证成功的标准是在SecurityContext中存储了用户相关的Authentication实例对象,也就是说当一个用户提供了正确信息给系统,系统带着用户的信息完成了一系列的校验后,校验通过后,将生成用户信息相关的Authentication存储到SecurityContext中。那么如果使用第三方登录,使用第三方如QQ、微信的用户信息进行登录验证,这是如何做到的呢?道理也是一样的,就是拿到第三方的用户信息,使用第三方的用户信息构建Authentication实例对象,并存储到SecurityContext中,而在获取第三方用户信息的时候,必须遵循OAuth协议,OAuth协议规定的流程,必须严格执行,那么Spring Social的作用就凸显了,它诞生的一个很大作用就是封装了OAuth协议规定的基础流程。 Spring Social已经将前五步封装了,开发者开发特定第三方登录验证,只需要实现第六步和第七步即可,最后组成一个SocialAuthenticationFilter集成到整个验证的过滤器链上,当用户选择第三方登录的时候,就会被该过滤器拦截,在过滤器中获取第三方用户信息,构建用户信息相关的Authentication实例对象并存储到SecurityContext中。

⒈pom依赖

<dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-core</artifactId>
    <version>1.1.6.RELEASE</version>
</dependency>

⒉一些常用接口及实现

social基本原理_1.jpg
social基本原理_2.jpg
social基本原理_3.jpg
social_4.jpg

1.ServiceProvider =》AbstractOAuth2ServiceProvider

服务提供商抽象接口,针对每一个服务提供商,例如QQ、微信、微博等,都需要提供一个ServiceProvider实现。

SpringSocial给我们提供了一个AbstractOAuth2ServiceProvider抽象类,它帮我们实现了一些共有的东西,我们实现服务提供商的时候只需要继承这个抽象类就可以了。 ServiceProvider:它是一个接口,在包org.springframework.social下,它的存在就是为了适配不同的第三方服务提供商,比如QQ、微信等。如果我们需要开发QQ登录,那么我们就需要为QQ提供一个特定的ServiceProvider,而这个接口下有一个抽象实现AbstractOAuth2ServiceProvider,我们为QQ写ServiceProvider的时候只需要继承AbstractOAuth2ServiceProvider类即可。抽象类AbstractOAuth2ServiceProvider有两个属性OAuth2Operations和Api,接下来分别介绍它们的作用。

2.OAuth2Operations =》 OAuth2Template

OAuth2Operations 接口封装了OAuth2协议的从①步到第⑤步,实际上OAuth2协议的第①步到第⑤步是一个标准的流程,第⑥步是一个个性化的流程,因为第⑥步每一个服务提供商所提供的用户信息数据结构是不一样的。SpringSocial给我们提供了一个OAuth2Operations标准的实现类OAuth2Template。 OAuth2Operations:它是一个接口,在包org.springframework.social.oauth2下,它封装了OAuth协议的前五步,也就是用户授权,直到应用拿到第三方应用(QQ、微信)的访问令牌,该接口有一个实现类OAuth2Template,OAuth2Template完成了访问第三方应用认证服务器、获取授权码、携带授权码申请令牌、获取令牌等核心步骤,在这里,我们需要做的仅仅是配置一些特定第三方认证服务器的URL即可,因为整个流程是遵循OAuth协议的,所以这些核心步骤需要携带的参数都是公共的,对开发者透明的。

3.Api(SpringSocial没有提供,需要我们自己来写) =》 AbstractOAuth2ApiBinding

因为每一个服务提供商对用户基本信息的调用都是不同的,所以需要我们自己去写一个Api接口来封装获取用户信息(第⑥步)的方法。SpringSocial给我们提供了一个AbstractOAuth2ApiBinding抽象类来帮助我们更快的完成第⑥步的实现。 Api:在包org.springframework.social下有一个ApiBinding接口,它主要是为了帮助开发者完成第六步的一个接口,由于每一个第三方应用的用户信息都是有区别的,比如用户头像的字段,在QQ里面叫head_image,也许到了微信里面,就叫image了,所以这里是一个个性化的开发区域,需要对每一个第三方服务提供商开发一个特定的类来实现用户数据的获取,这里Spring Social提供了一个抽象类AbstractOAuth2ApiBinding,尽可能地减少我们的开发成本,我们在开发获取用户信息的代码的时候,只需要继承这个抽象类即可。

4.ConnectionFactory =》OAuth2ConnectionFactory

负责创建我们Connection实例,也就是包含前6步获取到的用户信息的对象。为了创建Connection实例,ConnectionFactory 需要系统前6步的流程,走前6步的流程就需要ServiceProvider,因此,ConnectionFactory包含着一个ServiceProvider实例,在开发中,我们需要调用ConnectionFactory的ServiceProvider实例来完成前6步的流程,将获取到的用户信息封装成一个Connection。 Connection:它是一个接口,在包org.springframework.social.connect下,它封装了与用户相关的信息,这些信息,比如DisplayName(显示名称),ProfileUrl(主页地址),ImageUrl(头像地址)等基本信息,这些信息是Spring Social所规定的用户信息(固定字段),它有一个实现类OAuth2Connection,也就是说我们如何将拿到的用户信息转换成OAuth2Connection所封装的用户信息呢?那么就必须得讲解一下生成Connection实现类对象的工厂ConnectionFactory。

5.Connection =》 OAuth2Connection

封装我们前6步获取到的用户信息,由ConnectionFactory创建(一个连接工厂)。Connection 是一个固定的数据结构(字段名和字段都是固定的),每一个服务提供商的用户数据定义都是不一样的,我们需要通过ApiAdapter将每个服务商不一样的数据结构转化成Connection这样一个标准的数据结构。 ConnectionFactory:它是一个接口,在包org.springframework.social.connect下,它有一个实现类OAuth2ConnectionFactory,该类就可以完成对Connection的创建,而在OAuth2ConnectionFactory的构造方法中,就用到了ServiceProvider和ApiAdapter。ServiceProvider就是我们之前为特定第三方服务提供商编写的代码,它提供了从第三方服务提供商获取用户信息,ApiAdapter是一个适配器,主要是完成了从第三方服务提供商获取到的用户信息到Spring Social规定的用户信息的转换工作,这个适配器也是需要我们自己编写的内容之一。那么有了ServiceProvider和ApiAdapter,就可以构建OAuth2ConnectionFactory对象,那么就可以来创建Connection的实现类对象了。

6.ApiAdapter

顾名思义,就是在我们的Api接口和Connection接口之间做一个适配,将每个服务商不一样的数据结构转化成Connection这样一个标准的数据结构。

7.UsersConnectionRepository =》JdbcUsersConnectionRepository

将Connection 信息(即前6步获取到的用户信息)存储到数据库UserConnection表中。 UserConnection:UserConnection是Spring Social规定的一张数据库表。当用户在登录系统的时候,选择的是QQ登录或者微信登录,那么系统是如何辨别该用户使用QQ号登录的时候,它对应到系统中的一个用户呢?也就是说用户使用的第三方账户A登录,系统是如何做到与业务系统里面的“张三”关联起来的呢?那么这个功劳就应该归属于UserConnection表了,它就是专门用来记录第三方账户和业务系统内的账户之间的关系的一张表。 UsersConnectionRepository:它是一个接口,在包org.springframework.social.connect下,它专门封装了UserConnection表的一些基础操作,他有一个默认实现类JdbcUsersConnectionRepository,在该类的包下,有一个JdbcUsersConnectionRepository.sql文件,这个文件中有创建表的语句,需要我们自己拷贝出来创建对应的数据库表,该表名可以是UserConnection,也可以在该名称之前加上一个前缀。这里贴出创建表的语句:

create table UserConnection (userId varchar(255) not null,
	providerId varchar(255) not null,
	providerUserId varchar(255),
	rank int not null,
	displayName varchar(255),
	profileUrl varchar(512),
	imageUrl varchar(512),
	accessToken varchar(512) not null,
	secret varchar(512),
	refreshToken varchar(512),
	expireTime bigint,
	primary key (userId, providerId, providerUserId));
create unique index UserConnectionRank on UserConnection(userId, providerId, rank);

这里就完成了对Spring Social集成第三方登录需要开发内容的基本介绍