做娃衣的布料去哪个网站,普陀区网站建,济南建设设备安装有限责任公司,怎样选wordpress主题在上一篇文章中 #xff0c;我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里#xff0c;我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现#xff0c;以将用户连接数据持久保存到关系数据库中。 但是#xff… 在上一篇文章中 我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现以将用户连接数据持久保存到关系数据库中。 但是我使用的是MongoDB因此我需要自定义代码并且发现这样做相对容易。 用户连接数据将另存为UserSocialConnection对象它是一个MongoDB文档 SuppressWarnings(serial)
Document(collection UserSocialConnection)
public class UserSocialConnection extends BaseEntity {private String userId;private String providerId;private String providerUserId;private String displayName;private String profileUrl;private String imageUrl;private String accessToken;private String secret;private String refreshToken;private Long expireTime;//Getter/Setter omitted.public UserSocialConnection() {super();}public UserSocialConnection(String userId, String providerId, String providerUserId, int rank,String displayName, String profileUrl, String imageUrl, String accessToken, String secret,String refreshToken, Long expireTime) {super();this.userId userId;this.providerId providerId;this.providerUserId providerUserId;this.displayName displayName;this.profileUrl profileUrl;this.imageUrl imageUrl;this.accessToken accessToken;this.secret secret;this.refreshToken refreshToken;this.expireTime expireTime;}
} BaseEntity仅具有“ id”。 借助于Spring Data项目我不需要为UserSocialConnection编写任何CRUD操作代码只需扩展MongoRepository public interface UserSocialConnectionRepository extends MongoRepositoryUserSocialConnection, String{ListUserSocialConnection findByUserId(String userId);ListUserSocialConnection findByUserIdAndProviderId(String userId, String providerId);ListUserSocialConnection findByProviderIdAndProviderUserId(String providerId, String providerUserId);UserSocialConnection findByUserIdAndProviderIdAndProviderUserId(String userId, String providerId, String providerUserId);ListUserSocialConnection findByProviderIdAndProviderUserIdIn(String providerId, CollectionString providerUserIds);
} 在拥有数据库UserSocialConnectionRepository 我们将实现Spring Social所需的ConnectionRepository和UsersConnectionRepository 。 我只是从JdbcConnectionRepository和JdbcUsersConnectionRepository复制了代码并创建了自己的MongoConnectionRepository和MongoUsersConnectionRepository 。 public class MongoUsersConnectionRepository implements UsersConnectionRepository{private final UserSocialConnectionRepository userSocialConnectionRepository;private final SocialAuthenticationServiceLocator socialAuthenticationServiceLocator;private final TextEncryptor textEncryptor;private ConnectionSignUp connectionSignUp;public MongoUsersConnectionRepository(UserSocialConnectionRepository userSocialConnectionRepository, SocialAuthenticationServiceLocator socialAuthenticationServiceLocator, TextEncryptor textEncryptor){this.userSocialConnectionRepository userSocialConnectionRepository;this.socialAuthenticationServiceLocator socialAuthenticationServiceLocator;this.textEncryptor textEncryptor;}/*** The command to execute to create a new local user profile in the event no user id could be mapped to a connection.* Allows for implicitly creating a user profile from connection data during a provider sign-in attempt.* Defaults to null, indicating explicit sign-up will be required to complete the provider sign-in attempt.* see #findUserIdsWithConnection(Connection)*/public void setConnectionSignUp(ConnectionSignUp connectionSignUp) {this.connectionSignUp connectionSignUp;}public ListString findUserIdsWithConnection(Connection? connection) {ConnectionKey key connection.getKey();ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByProviderIdAndProviderUserId(key.getProviderId(), key.getProviderUserId());ListString localUserIds new ArrayListString();for (UserSocialConnection userSocialConnection : userSocialConnectionList){localUserIds.add(userSocialConnection.getUserId());}if (localUserIds.size() 0 connectionSignUp ! null) {String newUserId connectionSignUp.execute(connection);if (newUserId ! null){createConnectionRepository(newUserId).addConnection(connection);return Arrays.asList(newUserId);}}return localUserIds;}public SetString findUserIdsConnectedTo(String providerId, SetString providerUserIds) {final SetString localUserIds new HashSetString();ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByProviderIdAndProviderUserIdIn(providerId, providerUserIds);for (UserSocialConnection userSocialConnection : userSocialConnectionList){localUserIds.add(userSocialConnection.getUserId());}return localUserIds;}public ConnectionRepository createConnectionRepository(String userId) {if (userId null) {throw new IllegalArgumentException(userId cannot be null);}return new MongoConnectionRepository(userId, userSocialConnectionRepository, socialAuthenticationServiceLocator, textEncryptor);}} MongoUsersConnectionRepository非常类似于JdbcUsersConnectionRepository 。 但是对于MongoConnectionRepository 我需要进行一些更改 public class MongoConnectionRepository implements ConnectionRepository {private final String userId;private final UserSocialConnectionRepository userSocialConnectionRepository;private final SocialAuthenticationServiceLocator socialAuthenticationServiceLocator;private final TextEncryptor textEncryptor;public MongoConnectionRepository(String userId, UserSocialConnectionRepository userSocialConnectionRepository,SocialAuthenticationServiceLocator socialAuthenticationServiceLocator, TextEncryptor textEncryptor) {this.userId userId;this.userSocialConnectionRepository userSocialConnectionRepository;this.socialAuthenticationServiceLocator socialAuthenticationServiceLocator;this.textEncryptor textEncryptor;}public MultiValueMapString, Connection? findAllConnections() {ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByUserId(userId);MultiValueMapString, Connection? connections new LinkedMultiValueMapString, Connection?();SetString registeredProviderIds socialAuthenticationServiceLocator.registeredProviderIds();for (String registeredProviderId : registeredProviderIds) {connections.put(registeredProviderId, Collections.Connection? emptyList());}for (UserSocialConnection userSocialConnection : userSocialConnectionList) {String providerId userSocialConnection.getProviderId();if (connections.get(providerId).size() 0) {connections.put(providerId, new LinkedListConnection?());}connections.add(providerId, buildConnection(userSocialConnection));}return connections;}public ListConnection? findConnections(String providerId) {ListConnection? resultList new LinkedListConnection?();ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByUserIdAndProviderId(userId, providerId);for (UserSocialConnection userSocialConnection : userSocialConnectionList) {resultList.add(buildConnection(userSocialConnection));}return resultList;}SuppressWarnings(unchecked)public A ListConnectionA findConnections(ClassA apiType) {List? connections findConnections(getProviderId(apiType));return (ListConnectionA) connections;}public MultiValueMapString, Connection? findConnectionsToUsers(MultiValueMapString, String providerUsers) {if (providerUsers null || providerUsers.isEmpty()) {throw new IllegalArgumentException(Unable to execute find: no providerUsers provided);}MultiValueMapString, Connection? connectionsForUsers new LinkedMultiValueMapString, Connection?();for (IteratorEntryString, ListString it providerUsers.entrySet().iterator(); it.hasNext();) {EntryString, ListString entry it.next();String providerId entry.getKey();ListString providerUserIds entry.getValue();ListUserSocialConnection userSocialConnections this.userSocialConnectionRepository.findByProviderIdAndProviderUserIdIn(providerId, providerUserIds);ListConnection? connections new ArrayListConnection?(providerUserIds.size());for (int i 0; i providerUserIds.size(); i) {connections.add(null);}connectionsForUsers.put(providerId, connections);for (UserSocialConnection userSocialConnection : userSocialConnections) {String providerUserId userSocialConnection.getProviderUserId();int connectionIndex providerUserIds.indexOf(providerUserId);connections.set(connectionIndex, buildConnection(userSocialConnection));}}return connectionsForUsers;}public Connection? getConnection(ConnectionKey connectionKey) {UserSocialConnection userSocialConnection this.userSocialConnectionRepository.findByUserIdAndProviderIdAndProviderUserId(userId, connectionKey.getProviderId(),connectionKey.getProviderUserId());if (userSocialConnection ! null) {return buildConnection(userSocialConnection);}throw new NoSuchConnectionException(connectionKey);}SuppressWarnings(unchecked)public A ConnectionA getConnection(ClassA apiType, String providerUserId) {String providerId getProviderId(apiType);return (ConnectionA) getConnection(new ConnectionKey(providerId, providerUserId));}SuppressWarnings(unchecked)public A ConnectionA getPrimaryConnection(ClassA apiType) {String providerId getProviderId(apiType);ConnectionA connection (ConnectionA) findPrimaryConnection(providerId);if (connection null) {throw new NotConnectedException(providerId);}return connection;}SuppressWarnings(unchecked)public A ConnectionA findPrimaryConnection(ClassA apiType) {String providerId getProviderId(apiType);return (ConnectionA) findPrimaryConnection(providerId);}public void addConnection(Connection? connection) {//check cardinalitySocialAuthenticationService? socialAuthenticationService this.socialAuthenticationServiceLocator.getAuthenticationService(connection.getKey().getProviderId());if (socialAuthenticationService.getConnectionCardinality() ConnectionCardinality.ONE_TO_ONE ||socialAuthenticationService.getConnectionCardinality() ConnectionCardinality.ONE_TO_MANY){ListUserSocialConnection storedConnections this.userSocialConnectionRepository.findByProviderIdAndProviderUserId(connection.getKey().getProviderId(), connection.getKey().getProviderUserId());if (storedConnections.size() 0){//not allow one providerId connect to multiple userIdthrow new DuplicateConnectionException(connection.getKey());}}UserSocialConnection userSocialConnection this.userSocialConnectionRepository.findByUserIdAndProviderIdAndProviderUserId(userId, connection.getKey().getProviderId(), connection.getKey().getProviderUserId());if (userSocialConnection null) {ConnectionData data connection.createData();userSocialConnection new UserSocialConnection(userId, data.getProviderId(), data.getProviderUserId(), 0,data.getDisplayName(), data.getProfileUrl(), data.getImageUrl(), encrypt(data.getAccessToken()),encrypt(data.getSecret()), encrypt(data.getRefreshToken()), data.getExpireTime());this.userSocialConnectionRepository.save(userSocialConnection);} else {throw new DuplicateConnectionException(connection.getKey());}}public void updateConnection(Connection? connection) {ConnectionData data connection.createData();UserSocialConnection userSocialConnection this.userSocialConnectionRepository.findByUserIdAndProviderIdAndProviderUserId(userId, connection.getKey().getProviderId(), connection.getKey().getProviderUserId());if (userSocialConnection ! null) {userSocialConnection.setDisplayName(data.getDisplayName());userSocialConnection.setProfileUrl(data.getProfileUrl());userSocialConnection.setImageUrl(data.getImageUrl());userSocialConnection.setAccessToken(encrypt(data.getAccessToken()));userSocialConnection.setSecret(encrypt(data.getSecret()));userSocialConnection.setRefreshToken(encrypt(data.getRefreshToken()));userSocialConnection.setExpireTime(data.getExpireTime());this.userSocialConnectionRepository.save(userSocialConnection);}}public void removeConnections(String providerId) {ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByUserIdAndProviderId(userId, providerId);for (UserSocialConnection userSocialConnection : userSocialConnectionList) {this.userSocialConnectionRepository.delete(userSocialConnection);}}public void removeConnection(ConnectionKey connectionKey) {UserSocialConnection userSocialConnection this.userSocialConnectionRepository.findByUserIdAndProviderIdAndProviderUserId(userId, connectionKey.getProviderId(), connectionKey.getProviderUserId());this.userSocialConnectionRepository.delete(userSocialConnection);}// internal helpersprivate Connection? buildConnection(UserSocialConnection userSocialConnection) {ConnectionData connectionData new ConnectionData(userSocialConnection.getProviderId(),userSocialConnection.getProviderUserId(), userSocialConnection.getDisplayName(),userSocialConnection.getProfileUrl(), userSocialConnection.getImageUrl(),decrypt(userSocialConnection.getAccessToken()), decrypt(userSocialConnection.getSecret()),decrypt(userSocialConnection.getRefreshToken()), userSocialConnection.getExpireTime());ConnectionFactory? connectionFactory this.socialAuthenticationServiceLocator.getConnectionFactory(connectionData.getProviderId());return connectionFactory.createConnection(connectionData);}private Connection? findPrimaryConnection(String providerId) {ListUserSocialConnection userSocialConnectionList this.userSocialConnectionRepository.findByUserIdAndProviderId(userId, providerId);return buildConnection(userSocialConnectionList.get(0));}private A String getProviderId(ClassA apiType) {return socialAuthenticationServiceLocator.getConnectionFactory(apiType).getProviderId();}private String encrypt(String text) {return text ! null ? textEncryptor.encrypt(text) : text;}private String decrypt(String encryptedText) {return encryptedText ! null ? textEncryptor.decrypt(encryptedText) : encryptedText;}} 首先我将JdbcTemplate替换为UserSocialConnectionRepository以从数据库中检索UserSocialConnection对象。 然后从spring-social-security模块中用SocialAuthenticationServiceLocator替换ConnectionFactoryLocator 。 最大的变化是addConnection方法上面已突出显示它首先检查连接基数。 如果connectionCardinality的socialAuthenticationService是ONE_TO_ONE 这意味着一个用户id与一个且仅一个对providerId / providerUserId的或ONE_TO_MANY 这意味着一个用户id可以连接到一个或多个providerId / providerUserId但一对providerId / providerUserId的只能连接到一个userId。 完成所有这些自定义之后最后一步是在spring config中将它们粘合在一起 Configuration
public class SocialAndSecurityConfig {Injectprivate Environment environment;InjectAccountService accountService;Injectprivate AuthenticationManager authenticationManager;Injectprivate UserSocialConnectionRepository userSocialConnectionRepository;Beanpublic SocialAuthenticationServiceLocator socialAuthenticationServiceLocator() {SocialAuthenticationServiceRegistry registry new SocialAuthenticationServiceRegistry();//add googleOAuth2ConnectionFactoryGoogle googleConnectionFactory new GoogleConnectionFactory(environment.getProperty(google.clientId),environment.getProperty(google.clientSecret));OAuth2AuthenticationServiceGoogle googleAuthenticationService new OAuth2AuthenticationServiceGoogle(googleConnectionFactory);googleAuthenticationService.setScope(https://www.googleapis.com/auth/userinfo.profile);registry.addAuthenticationService(googleAuthenticationService);//add twitterOAuth1ConnectionFactoryTwitter twitterConnectionFactory new TwitterConnectionFactory(environment.getProperty(twitter.consumerKey),environment.getProperty(twitter.consumerSecret));OAuth1AuthenticationServiceTwitter twitterAuthenticationService new OAuth1AuthenticationServiceTwitter(twitterConnectionFactory);registry.addAuthenticationService(twitterAuthenticationService);//add facebookOAuth2ConnectionFactoryFacebook facebookConnectionFactory new FacebookConnectionFactory(environment.getProperty(facebook.clientId),environment.getProperty(facebook.clientSecret));OAuth2AuthenticationServiceFacebook facebookAuthenticationService new OAuth2AuthenticationServiceFacebook(facebookConnectionFactory);facebookAuthenticationService.setScope();registry.addAuthenticationService(facebookAuthenticationService);return registry;}/*** Singleton data access object providing access to connections across all users.*/Beanpublic UsersConnectionRepository usersConnectionRepository() {MongoUsersConnectionRepository repository new MongoUsersConnectionRepository(userSocialConnectionRepository,socialAuthenticationServiceLocator(), Encryptors.noOpText());repository.setConnectionSignUp(autoConnectionSignUp());return repository;}/*** Request-scoped data access object providing access to the current users connections.*/BeanScope(value request, proxyMode ScopedProxyMode.INTERFACES)public ConnectionRepository connectionRepository() {UserAccount user AccountUtils.getLoginUserAccount();return usersConnectionRepository().createConnectionRepository(user.getUsername());}/*** A proxy to a request-scoped object representing the current users primary Google account.* * throws NotConnectedException* if the user is not connected to Google.*/BeanScope(value request, proxyMode ScopedProxyMode.INTERFACES)public Google google() {ConnectionGoogle google connectionRepository().findPrimaryConnection(Google.class);return google ! null ? google.getApi() : new GoogleTemplate();}BeanScope(valuerequest, proxyModeScopedProxyMode.INTERFACES) public Facebook facebook() {ConnectionFacebook facebook connectionRepository().findPrimaryConnection(Facebook.class);return facebook ! null ? facebook.getApi() : new FacebookTemplate();}BeanScope(valuerequest, proxyModeScopedProxyMode.INTERFACES) public Twitter twitter() {ConnectionTwitter twitter connectionRepository().findPrimaryConnection(Twitter.class);return twitter ! null ? twitter.getApi() : new TwitterTemplate();}Beanpublic ConnectionSignUp autoConnectionSignUp() {return new AutoConnectionSignUp(accountService);}Beanpublic SocialAuthenticationFilter socialAuthenticationFilter() {SocialAuthenticationFilter filter new SocialAuthenticationFilter(authenticationManager, accountService,usersConnectionRepository(), socialAuthenticationServiceLocator());filter.setFilterProcessesUrl(/signin);filter.setSignupUrl(null); filter.setConnectionAddedRedirectUrl(/myAccount);filter.setPostLoginUrl(/myAccount);return filter;}Beanpublic SocialAuthenticationProvider socialAuthenticationProvider(){return new SocialAuthenticationProvider(usersConnectionRepository(), accountService);}Beanpublic LoginUrlAuthenticationEntryPoint socialAuthenticationEntryPoint(){return new LoginUrlAuthenticationEntryPoint(/signin);}} accountService是我自己的用户帐户服务提供与帐户相关的功能它实现了SocialUserDetailsService UserDetailsService UserIdExtractor 。 还有很多地方需要改进例如重构MongoConnectionRepository和MongoUsersConnectionRepository以使用Spring Data Repository接口来实现抽象的社交连接存储库实现。 而且我发现有人已经对此提出了一个问题 为UsersConnectionRepository利用Spring数据 。 参考来自我们的JCG合作伙伴 Yuan Ji在Jiwhiz博客上为MongoDB定制Spring Social Connect Framework 。 翻译自: https://www.javacodegeeks.com/2013/03/customize-spring-social-connect-framework-for-mongodb.html