官网地址:https://projects.spring.io/spring-social/
Spring Social的基础是什么?
Spring Social实现第三方应用的登录,是根据OAuth协议来提供功能的。OAuth协议是一个授权协议,其目的是让用户不将服务提供商的用户名密码,提供给第三方应用的情况下,让第三方应用能够访问服务提供商的资源。
常见的应用场景有:第三方应用通过QQ登录、微信登录等。
下面这张图展示了OAuth协议中,标准的授权码模式。
Spring Social 做了什么?
Spring Social 就是将这整个流程封装起来并进行实现。它把整个流程封装到了SocialAuthenticationFilter的过滤器中然后把这个过滤器加入到了SpringSecurity的过滤器链上。当访问请求的时候,SocialAuthenticationFilter会将请求拦截下来然后将整个流程走完。进而去实现第三方登录。
Spring Social是如何将这一流程封装到特定的接口和类中去的?
服务提供商相关
从上面我们可以看到整个授权流程,从第一步到第六步都需要和服务提供商打交道。其中第一步到第五步是一个标注给你的流程,第六步获取用户信息是一个个性化的操作,因为每一个服务提供商返回的用户数据结构都不同。
- ServiceProvider接口,这个接口是服务提供商的一个抽象,针对每一个服务提供商(QQ、微信),都需要一个ServiceProvider接口的一个实现。SpringSocial提供了一个AbstractOauth2ServiceProvider抽象类,实现了一些共有的东西,如果要自己写,只需要继承这个类实现其中的公有方法即可。
- Oauth2Operation(封装第一步到第五步)。Spring提供了一个默认的实现叫Oauth2Template,这个类会帮助我们去完成Oauth协议的执行流程。
- Api(个性化第六步),实际上没有一个明确的接口,因为每一个服务提供商对于用户基本信息的调用都是有区别的。SpringSocial其实也提供了一个抽象类叫AbstractOauth2ApiBinding帮助我们快速开发第六步的实现。
第三方应用内部
完成了第一步到第六步,用户信已经获取到了。到了第七步实际上就跟服务提供商没有任何关系了。都是在第三方应用Client内部去完成的。
- 第一个接口是Connection,SpringSocial提供的实现类叫OAuth2Connection。其作用是封装前六步执行完毕之后获取到的用户信息。
- Connection是由ConnectionFactory创建出来的,用到的类叫OAuth2ConnectionFactory。它的作用就是为了创建Connection对象获取用户信息,但是用户信息是在ServiceProvider中去构建的。所以在OAuth2ConnectionFactory中肯定有一个ServiceProvider实例,将ServiceProvider封装起来放到Connection中去。其中Connection的对象名和字段名都是固定的。
之前说过,每一个服务提供商对于用户信息的定义的数据结构都是不一样的,那么ConnectionFactory是如何做到将这些不用数据结构的信息转化成对象名和字段名都是固定的Connection的对象的呢?
- ConnectionFactory中有一个ApiAdapter,将不同格式的用户信息转化为固定格式的Connection对象就是由ApiAdapter接口的实现来完成。转化成功之后就将Connection中封装进去一个用户信息。
流程完成之后
我们拿到了服务提供商返回给的用户信息之后,是需要将这个用户信息同步到我们自定义的数据库中去的。那么如何去实现将传过来的用户信息与我们系统中已经保存的用户信息去进行对应的呢?实际上这个对应关系是存在数据库中的。数据库中有一个用户对应表,里面有自己定义的userId以及服务提供商那边对应的用户信息的唯一标识。
那么由谁来操纵这个表呢?就是由UsersConnectionRepository存储器去实现的。在代码中用到的实现类叫做JdbcUsersConnectionRepository,这个类的作用就是去数据库中针对用户对应关系表去做一些增删改查的操作。