前言
- 上一节我们讲解了oauth协议,他其实就是一个授权协议。一个用户在不将服务提供商的用户名/密码交给第三方应用的时候。让第三方应用可以有权限去访问用户存在服务提供商上资源。这就是oauth协议存在的目的。
- 授权协议与我们要实现的第三方登录:qq登录、微信登录是一个什么关系呢?
在上一节中,我们使用oauth协议获取用户的自拍数据,现在我们不是去拿用户的自拍数据,而是拿用户的基本信息(昵称、头像),我拿到了这些信息之后,再根据用户的的这些信息构建Authentication并放进SecurityContext里面(前面两个类的关系是:当我们往SecurityContext里放入经过验证了的Authentication的实例之后,实际上对SpringSecurity来说你就登录成功了)。我们引导用户走完0-7的流程,实际上就相当于用户使用他在服务提供商上面用户的基本信息登录了我们的第三方应用。这个就是所谓的第三方登录(比如:QQ、微信登录的实现原理)。
Spring Social在上面干了什么呢?Spring Social其实就是把上面0-7流程封装到了一个叫做Social AuthenticationFilter里面。然后把这个过滤器加到了Spring Security的过滤器链上。这样当你访问某个请求的时候,Social AuthenticationFilter会把这个请求拦截下来。然后带着你把这个流程走完。 实际上就实现了微信登录。
内容
- SpringSocial上图中的基本逻辑里面,其实都需要和服务提供商打交道。所以我们需要介绍的第一个接口就是ServiceProvider(AbstractOAuth2ServiceProvider)--其实就是一个服务提供商的抽象
- 针对每个具体的服务提供商:比如说:QQ、微信、新浪都需要提供一个ServiceProvider这个接口的实现,Spring Social给我们提供了一个AbstractOAuth2ServiceProvider这样一个抽象类,他帮我们去实现了一个共有的东西,我们如果需要再实现QQ登录功能时候,我们去继承这个抽象类就可以了。这里注意抽象类名有一个OAuth2,指代我们抽象的OAuth2协议。国外很多用OAuth1协议有一些,国内使用OAuth2的比较多。
- 从上面流程图看:1-5步是一个标准的流程,就是我们所说的oauth协议流程,第六步 是一个个性化的流程。因为第6步不同用户的服务提供商的用户信息数据结构都是不一样的。可能有些服务提供商提供的就是3个字段,有的服务提供商提供的可能就是5个字段。针对于1-5步和第6步,其实Spring Social提供给我们了两个抽象的类:OAuth2Operations(OAuth2Template)---处理1-5 和 Api(AbstractAuth2ApiBinding)-- 处理6
- 第7步其实跟我们服务提供商是没有关系的了。是在我们第三方应用内部完成的。第7步的Connection接口是封装的我们1-6步的用户信息,实际上他的实现类是OAuth2Connection;Connection它是由谁创建的呢?他是由ConnectionFactory创建的,实际上用到的类是OAuth2ConnectionFactory;这个工厂负责创建我们的Connection实例,也就是包含用户信息(1-6步)的对象。为了创建这个对象,那么他们就需要走这个流程(1-6),为了走这个流程其实服务提供商提供了ServiceProvider(封装1-6)这么一个实例。所以ConnectionFactory 他会调用ServiceProvider走上面1-6步的流程以此来获取用户信息,把这个用户信息封装成一个Connection;这里有一个问题,那就是Connnection是一个固定的数据结构,前面我们说了第6步获取用户信息时候其实每一个用户提供商,他的定义都不一样了,如何把这些每个服务上都不一样的数据结构转化成Connection这个标准的数据结构,这个是使用一个ApiAdapter来实现。ApiAdapter顾名思义就是在我们Api和Connection之间做一个适配。
- Connection使我们服务提供商封装的用户信息,在我们的业务系统里面用户信息会存放到一张users表里面。那么业务系统里面的用户信息和我们的服务提供商的用户信息关联在一块呢?也就是服务提供商的A用户他登录时候,如何知道他实际上使我业务系统里面“张三"登录了呢?这个对应关系是怎样定义的呢?实际上这个对应关系会存在数据库里面的:数据库里面有一个UserConnection表,这张表存储了业务表里面的userid和服务提供商的用户Connection之间的一个对应关系,那么由谁来操作这个UserConnection表呢?是使用:UsersConnectionRepository(JdbcUsersConnectionRepository)从这个名字可以看出他是一个存储器,真正我们用到的是JdbcUsersConnectionRepository。
- Spring Social的基本概念,我们现在基本介绍完了,需要注意的是:这里我们介绍的概念全部是在开发中我们自己要写代码时候涉及到的而一些概念。就像我们之前讲解Spring Security做表单登录时候,我们实现处理登录成功和登录失败自定义类逻辑。与此类似,我们自己需要自己做一些实现去实现这些。
官网参考:projects.spring.io/spring-social/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。