在我目前的spring项目中,我最近添加了对使用Spring-Social的社交登录的支持。主要的配置类如下:
@Configuration
@EnableSocial
@ComponentScan(value="com.webapp.loja")
public class SocialContext implements SocialConfigurer {
@Autowired
private DataSource dataSource;
@Autowired
private SignInAdapter signInAdapter;
@Autowired
private ConnectionSignUp connectionSignUp;
@Override
public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {
cfConfig.addConnectionFactory(new TwitterConnectionFactory("...", "..."));
cfConfig.addConnectionFactory(new FacebookConnectionFactory("...", "..."));
}
@Override
public UserIdSource getUserIdSource() {
return new AuthenticationNameUserIdSource();
}
@Override
public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
repository.setConnectionSignUp(connectionSignUp);
return repository;
}
@Bean
public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) {
return new ConnectController(connectionFactoryLocator, connectionRepository);
}
@Bean
public ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository connectionRepository) {
return new ProviderSignInController(connectionFactoryLocator, connectionRepository, signInAdapter);
}
}我的问题是,当我尝试使用任何社交媒体服务登录应用程序时,应用程序会先执行connectionSignUp类,然后执行signInAdapter。
我想要相反的行为:首先,应用程序应该执行signInAdapter,其中我尝试查找用户是否已经存在:
@Service
public class SimpleSignInAdapter implements SignInAdapter {
@Autowired
private SocialUserDetailsService socialUserDetailsService;
@Override
public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
SocialUserDetails user = socialUserDetailsService.loadUserByUserId(userId);
if(user != null) {
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getAuthorities()));
return user.getUsername();
} else {
return null;
}
}
}仅当未找到用户(返回null)时,应用程序才应执行connectionSignUp类来创建新帐户:
@Component
public class AccountConnectionSignUp implements ConnectionSignUp {
@Autowired
private UsuarioHome accountRepository;
@Override
public String execute(Connection<?> connection) {
UserProfile profile = connection.fetchUserProfile();
Usuario account = new Usuario(profile.getUsername(), profile.getFirstName(), profile.getLastName(), profile.getEmail());
accountRepository.persist(account);
return profile.getUsername();
}
}有没有人知道这是否可能?
发布于 2015-01-13 18:24:44
嗯,我觉得点菜没问题吧?在connectionSignUp中,您可以检查用户是否已经持久化。如果是,则继续并让用户登录。如果没有,请注册该用户。然后帮他签到?
https://stackoverflow.com/questions/26455371
复制相似问题