+import java.math.BigInteger;
import javax.inject.Inject;
+import javax.sql.DataSource;
import org.apache.http.HttpRequestFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.core.env.Environment;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.social.config.annotation.ConnectionFactoryConfigurer;
import org.springframework.social.config.annotation.EnableSocial;
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.social.connect.ConnectionSignUp;
import org.springframework.social.connect.UsersConnectionRepository;
-import org.springframework.social.connect.mem.InMemoryUsersConnectionRepository;
+import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;
import org.springframework.social.connect.web.ConnectController;
import org.springframework.social.connect.web.ProviderSignInController;
import org.springframework.social.connect.web.SignInAdapter;
@EnableSocial
public class SocialConfig extends SocialConfigurerAdapter
{
+ @Inject
+ DataSource dataSource;
@Inject
ConnectionSignUp connectionSignUp;
@Inject
SignInAdapter signInAdapter;
+ @Value("${facebook.app.secret}")
+ String secret;
+ @Value("${facebook.app.salt}")
+ String salt;
+
/**
* Add a {@link FacebookConnectionFactory} to the configuration.
}
/**
- * Configure an instance of {@link InMemoryUsersConnection} as persistent
- * store of user/connection-mappings.
+ * {@inheritDoc}
*
- * At the moment, no special configuration is needed.
+ * Configure an instance of {@link JdbcUsersConnection} as persistent
+ * store of user/connection-mappings.
+ * <p>
+ * The app-secret is reused as password for the encryption of the data.
+ * The salt can be changed in the <code>pom.xml</code>
+ * <p>
+ * This does only work, if you have the Java Crypto Extension (JCE) in
+ * full strength version, since Spring Security is using a 256-bit key.
*
- * @param connectionFactoryLocator
- * The {@link ConnectionFactoryLocator} will be injected by Spring.
- * @return
- * The configured {@link UsersConnectionRepository}.
+ * @see http://stackoverflow.com/a/17637354
*/
@Override
public UsersConnectionRepository getUsersConnectionRepository(
ConnectionFactoryLocator connectionFactoryLocator
)
{
- InMemoryUsersConnectionRepository repository =
- new InMemoryUsersConnectionRepository(connectionFactoryLocator);
+ JdbcUsersConnectionRepository repository =
+ new JdbcUsersConnectionRepository(
+ dataSource,
+ connectionFactoryLocator,
+ Encryptors.text(
+ secret,
+ String.format("%08x", new BigInteger(1, salt.getBytes()))
+ )
+ );
repository.setConnectionSignUp(connectionSignUp);
return repository;
}