前面几篇文章讲了Spring Security的验证和授权的流程,还有基于数据库的用户验证。基于数据库的用户验证是传统的登录方式,先在应用中注册,然后根据注册的账号、密码进行登录。但现在的大多数应用都提供了利用第三方账号登录的方式。常见的就是访问网站时可以用QQ、微信、微博等社交网络的账号进行快速登录,而不用再去注册。这样做的好处主要有:
-
可以省去要用户重新注册的流程,同时也可以与用户已有的社交网络建立连接,可以通过与社交网络的集成来迅速积累人气;
-
允许用户把应用中的相关内容分享到社交网络中,可以保持用户的粘性,同时推广应用本身。
对于用户来说,通常的场景是在注册或登录页面,选择第三方社交网络来进行连接。然后跳转到第三方网站进行登录和授权。完成上述步骤之后,新的用户会被创建。在连接过程中,应用可以从第三方社交网站获取到用户的概要信息,来完成新用户的创建。当新用户创建完成之后,下次用户可以直接使用第三方社交网络的账号进行登录。
上述步骤中对账号进行登录和授权,并不是直接把账号和密码给第三方应用获取用户信息,这样做是很不安全的,而是通过在第三方应用和HTTP服务提供商(微信、QQ等应用的服务器)设置一个授权层,将用户资源和第三方应用隔离,使得第三方应用无法直接访问资源,从而起到保护资源的作用。这个授权层就是OAuth2.0。先说OAuth,它是一个关于授权(authorization)的开放网络标准,目前的版本是2.0版。详细的解读推荐看阮一峰大神的博文理解OAuth 2.0,真是深入浅出啊。
OAuth 2.0的运行流程,大概如下图所示
图中六个步骤,第二步第三方应用如何获取用户授权是最关键的步骤。理解OAuth 2.0文中介绍了四种授权模式,授权码模式是最常用也是最安全的模式。流程如下图所示:
当第三方应用得到认证服务器发放的令牌,就可以去资源服务器中获取用户的信息,然后根据用户信息构建Authentication,并放入SecurityContext中,这样就完成了新用户的创建。完成上述登录和授权的流程工作量还是比较大的。这就不得不介绍实现第三方登录的的框架Spring Social,从它的名字也可以看出主要是为了实现社交登录(Social Login)。Spring Social的功能就是把上述登录授权的流程封装到SocialAuthenticationFilter拦截器里,并把这个拦截器加入到Spring Security的过滤器链中。直接上图