2014-10-19 52 views
0

在我目前的春季項目中,我最近使用Spring-Social添加了對社交登錄的支持。主要配置類是這樣的:使用Spring-Social執行SignIn和SignUp方法的順序

@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); 
    } 

} 

我的問題是,當我嘗試在應用程序與任何社交媒體服務簽到,該應用程序執行firts的connectionSignUp類和signInAdapter後。

我想oposite行爲:第一個應用程序應該執行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(); 
    } 

} 

任何人都知道這是否可能?

回答

0

嗯,訂購對我來說好嗎?在connectionSignUp中,您可以檢查用戶是否已經保存。如果是,請繼續並簽入用戶。如果不是,請註冊用戶。然後簽下他?