在上一节中,成功封装了用户信息到了SocialAuthenticationProvider中出现了问题:
在SocialAuthenticationFilter中默认要去注册一个用户:morning跳转的注册请求是/signup
在SocialConfig中配置是自己配置的注册页面生效:
在配置文件中配置注册页面,如果不配置会使用系统默认的注册页面:
为了使跳转到注册页面时携带QQ的相关信息和注册完成后,将第三方的唯一标示传递给Social插入userConnections数据库中:有一个工具类:
封装QQ的用户相关信息:
/**
* 跳转到用户注册绑定页面携带的qq用户信息
* @author zhailiang
*
*/
public class SocialUserInfo {
private String providerId;
private String providerUserId;
private String nickname;
private String headimg;
public String getProviderId() {
return providerId;
}
public void setProviderId(String providerId) {
this.providerId = providerId;
}
public String getProviderUserId() {
return providerUserId;
}
public void setProviderUserId(String providerUserId) {
this.providerUserId = providerUserId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getHeadimg() {
return headimg;
}
public void setHeadimg(String headimg) {
this.headimg = headimg;
}
}
在BroswerSecurityController中添加获取QQ用户信息的处理:
在用户进行第三方用户和QQ用户进行注册绑定时将用户唯一标示给Social,并插入UsersConnection中:
这样就能够完成了QQ的登录的功能。
这里出现了一个问题:扫码注册后,再次扫码还是要跳转的注册页面,断点调试后发现:
在这里SocialConfig中明明配置了Jdbc的,但是上图中总是走InMemoryUsersConnectionRepository。
解决办法:
还有一种情况,就是将QQ的用户信息默认注册为一个在第三方中的用户:
在demo项目中配置:
/**
* 如若配置了DemoConnectionSignUp,就会默认将qq用户注册为一个新用户,不用跳转到注册或绑定的页面
* @author zhailiang
*
*/
@Component
public class DemoConnectionSignUp implements ConnectionSignUp {
/* (non-Javadoc)
* @see org.springframework.social.connect.ConnectionSignUp#execute(org.springframework.social.connect.Connection)
*/
@Override
public String execute(Connection<?> connection) {
//根据社交用户信息默认创建用户并返回用户唯一标识
return connection.getDisplayName();
}
}
修改SocialConfig:
@Autowired(required = false)
private ConnectionSignUp connectionSignUp;
@Override
public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource,
connectionFactoryLocator, Encryptors.noOpText());
repository.setTablePrefix("t_");
if(connectionSignUp != null) {
repository.setConnectionSignUp(connectionSignUp);
}
return repository;
}
至此QQ登录开发完成了。