Spring Seurity系列(十五) 开发QQ登录处理注册逻辑

 在上一节中,成功封装了用户信息到了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登录开发完成了。

猜你喜欢

转载自blog.csdn.net/newhanzhe/article/details/81276375