Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理
OAuth协议是一个授权协议,目的是让用户在不将服务提供商的用户名密码交给第三方应用的条件下,让第三方应用可以有权限访问用户存在服务提供商上的资源。
接着上一篇说的,在第三方应用获取到用户资源后,如果过去的不是用户的自拍数据,而是用户的昵称头像等基本信息,根据这些基本信息,构建经过认证的Authentication对象,放进SecurityContext,这对于spring security来说,就算认证成功了。第三方应用引导用户走完这个流程,就是用户使用用户在服务提供商的上的用户基本信息登录了第三方应用。

图一
SpringSocial:就是把这个流程封装成了一个SocialAuthenticationFilter过滤器,然后吧这个过滤器加到springsecurity的过滤器链上。
官方定义:将您的Spring应用程序与软件即服务(SaaS)API提供程序(如Facebook,Twitter和LinkedIn)连接起来。
这样当你访问某一个请求的时候,SocialAuthenticationFilter会把这个请求拦截下来,然后走完上图的流程。这样就是实现了微信登录。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
附 :Spring Security对登录成功的定义
在处理登录过滤器的抽象类AbstractAuthenticationProcessingFilter定义了的doFilter方法定义了登录操作:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res; if (!requiresAuthentication(request, response)) {
chain.doFilter(request, response); return;
} if (logger.isDebugEnabled()) {
logger.debug("Request is to process authentication");
} Authentication authResult; try {
authResult = attemptAuthentication(request, response);
if (authResult == null) {
// return immediately as subclass has indicated that it hasn't completed
// authentication
return;
}
sessionStrategy.onAuthentication(authResult, request, response);
}
catch (InternalAuthenticationServiceException failed) {
logger.error(
"An internal error occurred while trying to authenticate the user.",
failed);
unsuccessfulAuthentication(request, response, failed); return;
}
catch (AuthenticationException failed) {
// Authentication failed
unsuccessfulAuthentication(request, response, failed); return;
} // Authentication success
if (continueChainBeforeSuccessfulAuthentication) {
chain.doFilter(request, response);
} successfulAuthentication(request, response, chain, authResult);
}
其中的successfulAuthentication()方法定义了认证成功后的操作:
SecurityContextHolder.getContext().setAuthentication(authResult)这句话就是说,认证成功后,用SecurityContextHolder.getContext()获取到spring安全的上下文SecurityContext,往里边放一个认证类Authentication,这就算是登录成功了。
protected void successfulAuthentication(HttpServletRequest request,
HttpServletResponse response, FilterChain chain, Authentication authResult)
throws IOException, ServletException { if (logger.isDebugEnabled()) {
logger.debug("Authentication success. Updating SecurityContextHolder to contain: "
+ authResult);
} SecurityContextHolder.getContext().setAuthentication(authResult); rememberMeServices.loginSuccess(request, response, authResult); // Fire event
if (this.eventPublisher != null) {
eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(
authResult, this.getClass()));
} successHandler.onAuthenticationSuccess(request, response, authResult);
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Spring Social:
相关接口

图一中的步骤1~步骤6,都是在和服务提供商打交道
1,ServiceProvider:服务提供商的抽象,针对不同的服务提供商,如新浪、qq、微信,都需要一个ServiceProvider具体实现。
SpringSocial提供了AbstractOAuth2ServiceProvider抽象类,实现了共有的东西。我们使用时候继承这个类即可。
图一步中服务提供商中骤1~步骤5是OAuth标准的流程,第6步是个性化的。因为每一个服务提供商对的用户基本信息结构的定义都是不一样的。如字段的个数,名字可能都不一样。
OAuth2Operations:封装了第1步到第5步标准的OAuth协议的处理流程,Oauth2协议的相关的操作。这个接口Spring Social提供了一个默认的实现OAuth2Template。
Api:处理第6步需要的接口的实现,没有明确的接口,需要自定义,因为每个服务提供商对用户信息的调用都是有区别的。SpringSocial的默认实现是AbstractOAuth2Binding
2,Connection:用户信息的封装,命名是固定的,需要一个ApiAdapter适配器来转换api和connection。用来获取前6步获取到的用户信息,Spring Social的实现是OAuth2Connection,由ConnectionFactory工厂接口创建的(该工厂接口的默认实现是OAuth2ConnectionFactory,需要ServiceProvider),第7步是再第三方应用服务内部完成的。
3,UsersConnectionRepository:服务提供商里的用户和业务系统里的用户之间有对应关系,在spring social中是存在数据库中UserConnection表里,存储了业务中系统中User表的userid和服务提供商的用户(Connection)之间的对应关系。UsersConnectionRepository(默认实现是JdbcUsersConnectionRepository)来操作这个表
Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理的更多相关文章
- Spring Security构建Rest服务-1000-使用SpringSocial开发第三方登录之大白话OAuth协议
OAuth协议简介 OAuth协议要解决的问题 OAuth协议中的各种角色 OAuth协议运行流程 OAuth协议,在网上也看了一些资料,意思就是给你颁发一个临时的通行证,你拿着这个通行证可以访 ...
- Spring Security构建Rest服务-1200-SpringSecurity OAuth开发APP认证框架
基于服务器Session的认证方式: 前边说的用户名密码登录.短信登录.第三方登录,都是普通的登录,是基于服务器Session保存用户信息的登录方式.登录信息都是存在服务器的session(服务器的一 ...
- Spring Security构建Rest服务-0102-Spring Social开发第三方登录之qq登录
图一 基于SpringSocial实现qq登录,要走一个OAuth流程,拿到服务提供商qq返回的用户信息. 由上篇介绍的可知,用户信息被封装在了Connection里,所以最终要拿到Connectio ...
- Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录
基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...
- Spring Security构建Rest服务-1202-Spring Security OAuth开发APP认证框架之重构3种登录方式
SpringSecurityOAuth核心源码解析 蓝色表示接口,绿色表示类 1,TokenEndpoint 整个入口点,相当于一个controller,不同的授权模式获取token的地址都是 /oa ...
- Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录
浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...
- Spring Security构建Rest服务-1201-Spring Security OAuth开发APP认证框架之实现服务提供商
实现服务提供商,就是要实现认证服务器.资源服务器. 现在做的都是app的东西,所以在app项目写代码 认证服务器: 新建 ImoocAuthenticationServerConfig 类,@Ena ...
- Spring Security构建Rest服务-0702-短信验证码登录
先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...
- Spring Security构建Rest服务-0900-rememberMe记住我
Spring security记住我基本原理: 登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeS ...
随机推荐
- hdu 5007
http://acm.hdu.edu.cn/showproblem.php?pid=5007 字符串处理 暴力 #include <cstdio> #include <cstdlib ...
- DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)
关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html 问 ...
- Android-ActionBar-与Menu结合
ActionBar就是一个标题栏,以前Android3.0之前还称为标题栏,Android3.0之后取名为ActionBar 首先必须在AndroidManifest.xml中指定Applicatio ...
- 使用jetty-maven-plugin运行maven多项目
1.准备工作 org.eclipse.jetty jetty-maven-plugin 9.2.11.v20150529 jdk 1.7 maven 3.1 2.采用maven管理多项目 ...
- H2Database聚合函数
聚合函数(Aggregate Functions) AVG BOOL_AND BOOL_OR COUNT GROUP_CONCAT MAX MIN SUM SELECTIVITY ST ...
- Nodejs异步框架——async
上次的网页爬虫写完后,又打算做一个爬图的工具.前两天已经写好了代码.思路如下: 分析页面还是采用cheerio,对<div>中的img进行分析抽取,拿到图片的url.然后用childpro ...
- Transaction And Lock--使用资源锁来控制并发
写过程序的朋友都知道,在多线程处理时,对于非线程安全的对象,需用使用锁定特定对象(LOCK)的方法来保证串行操作.曾经有位开发询问我,在SQL Server内部是否有类似的实现方法来控制某一操作不能并 ...
- C# 使用ftp下载一个文件夹下的所有文件,包括子目录文件夹
这篇博客给大家补充一个方法,就是得到一个目录下的所有文件名称.在前端调用,大家写一个递归去遍历就可以了,我在这里就不在写了.具体ftp下载的方法在我的另一篇博客里有,需要的可以去看一下. /// &l ...
- NET 集合分页查询
参数: var list = new List<int>(); // 集合 ; // 总数量 ; // 每页查询数量 第一种: ? totalCount / pageSize : tota ...
- 盘点Xcode中开发者最喜爱的十大开源插件
Xcode IDE拥有着诸如导航.重构.校准等众多非常高大上的工具,而予以辅助的插件更是在Xcode的基础上对相关功能进行改进与扩展.在应用开发过程中,通过开源包管理器Alcatraz对插件进行安装管 ...