Java程序栈IT技术篇Java Web知识

九、SpringSocial基本原理

2019-01-17  本文已影响0人  一直想上树的猪

OAuth协议中我们了解到了这个协议其实是一个授权协议,其目的是让用户在不将服务提供商的用户名密码提供给第三方应用的情况下,让第三方应用能够访问服务提供商的资源。
我们在日常最常见的登录方式除了用户名密码登录,还有QQ登录、微信登录等方式。那么OAuth协议和这些登录方式是什么关系呢?
其实就是在访问资源服务器的时候,在登录时只要拿到用户在服务提供商上边的用户信息即可。然后根据用户信息构建Authentivcation并放入SecurityContext中去。

第三方登录实现的基本原理
这个就是第三方登录实现的基本原理和流程。
那么SpringSocial在这一过程中做了什么事情呢?
SpringSocial就是将这一整个流程封装起来并且去进行实现。
SocialAuthenticationFilter过滤器
它把整个流程封装到了SocialAuthenticationFilter的过滤器中然后把这个过滤器加入到了SpringSecurity的过滤器链上。当访问请求的时候,SocialAuthenticationFilter会将请求拦截下来然后将整个流程走完。进而去实现第三方登录。

SpringSocial是如何将这一流程封装到特定的接口和类中去的?

具体的类和接口
服务提供商相关

在整个流程上面,从第一步到第六步,都是需要跟服务提供商打交道的。所以它的第一个接口叫--ServiceProvider,它实际上就是服务提供商的一个抽象,针对每一个服务提供商(QQ、微信),都需要一个ServiceProvider接口的一个实现。SpringSocial提供了一个AbstractOauth2ServiceProvider抽象类,实现了一些共有的东西,如果要自己写,只需要继承这个类实现其中的公有方法即可。

回过头来再看整个流程:①第一步到第五步发放令牌其实是一个标准的流程。②到了第六步(获取用户信息)的时候其实就是一个个性化的实现,因为每一个服务提供商返回的用户信息的数据结构定义都不一样。

针对①和②,SpringSocial提供了两个接口:

第三方应用内部

到了第七步实际上就跟服务提供商没有任何关系了。都是在第三方应用Client内部去完成的。

注意:Connection的对象名和字段名都是固定的

之前说过,每一个服务提供商对于用户信息的定义的数据结构都是不一样的,那么ConnectionFactory是如何做到将这些不用数据结构的信息转化成对象名和字段名都是固定的Connection的对象的呢?
ConnectionFactory中有一个ApiAdapter,将不同格式的用户信息转化为固定格式的Connection对象就是由ApiAdapter接口的实现来完成。转化成功之后就将Connection中封装进去一个用户信息。

流程完成之后

我们拿到了服务提供商返回给的用户信息之后,是需要将这个用户信息同步到我们自定义的数据库中去的。那么如何去实现将传过来的用户信息与我们系统中已经保存的用户信息去进行对应的呢?实际上这个对应关系是存在数据库中的。数据库中有一个用户对应表,里面有自己定义的userId以及服务提供商那边对应的用户信息的唯一标识。
那么由谁来操纵这个表呢?就是由UsersConnectionRepository存储器去实现的。在代码中用到的实现类叫做JdbcUsersConnectionRepository,这个类的作用就是去数据库中针对用户对应关系表去做一些增删改查的操作。

上一篇 下一篇

猜你喜欢

热点阅读