社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ、人人网、开心网、新浪微博、搜狐微博、腾讯微博、淘宝、豆瓣、MSN、Google等社会化媒体账号登录该网站。
前言
在之前的Spring Social
系列中,我们只是实现了使用服务提供商账号登录到业务系统中,但没有与业务系统中的账号进行关联。本章承接之前社交系列来实现社交账号与业务系统账号的绑定与解绑。
- Spring-Security源码分析三-Spring-Social社交登录过程
- Spring-Security源码分析四-Spring-Social社交登录过程
- Spring-Security源码分析六-Spring-Social社交登录源码解析
UserConnection
create table UserConnection (
userId varchar(255) not null,
providerId varchar(255) not null,
providerUserId varchar(255),
......
primary key (userId, providerId, providerUserId));
create unique index UserConnectionRank on UserConnection(userId, providerId, rank);
在使用社交登录的时我们创建的UserConnection表,下面我们来简单分析一下
userId
业务系统的用户唯一标识(我们使用的是username
)providerId
用于区分不同的服务提供商(qq
,weixin
,weibo
)providerUserId
服务提供商返回的唯一标识(openid
)
社交登录注册实现
取消MyConnectionSignUp
在Spring-Security源码分析六-Spring-Social社交登录源码解析中,我们得知,当配置ConnectionSignUp
时,Spring Social
会根据我们配置的MyConnectionSignUp
返回userId
,接着执行userDetailsService.loadUserByUserId(userId)
,实现社交账号登录。当取消掉MyConnectionSignUp
则会抛出BadCredentialsException,BadCredentialsException
由SocialAuthenticationFilter处理,跳转到默认的/signup
注册请求,跳转之前会将当前的社交账号信息保存到session
中。
添加自定义注册请求/socialRegister
@Override
protected <T> T postProcess(T object) {
SocialAuthenticationFilter filter = (SocialAuthenticationFilter) super.postProcess(object);
filter.setFilterProcessesUrl(filterProcessesUrl);
filter.setSignupUrl("/socialRegister");