2014-09-24 105 views
1

我想通过Spring Security(我使用注释基础配置)将Spring Social Facebook集成到我的应用程序中。我需要的只是连接Facebook帐户与我的应用程序的帐户。在简单的例子,我发现这一点:春季社交Facebook +春季安全权限电子邮件和用户名范围

package eu.thinking4u.spring.social.simple.signinmvc.config; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.env.Environment; 
import org.springframework.security.crypto.encrypt.Encryptors; 
import org.springframework.social.UserIdSource; 
import org.springframework.social.config.annotation.ConnectionFactoryConfigurer; 
import org.springframework.social.config.annotation.EnableSocial; 
import org.springframework.social.config.annotation.SocialConfigurer; 
import org.springframework.social.connect.ConnectionFactoryLocator; 
import org.springframework.social.connect.ConnectionRepository; 
import org.springframework.social.connect.UsersConnectionRepository; 
import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository; 
import org.springframework.social.connect.web.ConnectController; 
import org.springframework.social.facebook.connect.FacebookConnectionFactory; 
import org.springframework.social.security.AuthenticationNameUserIdSource; 


@Configuration 
@EnableSocial 
public class SocialContext implements SocialConfigurer { 

    @Autowired 
    private DataSource dataSource; 

    /** 
    * Configures the connection factories for Facebook and Twitter. 
    * @param cfConfig 
    * @param env 
    */ 
    public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) { 
     /* cfConfig.addConnectionFactory(new TwitterConnectionFactory(
       env.getProperty("twitter.consumer.key"), 
       env.getProperty("twitter.consumer.secret") 
     ));*/ 
     /*cfConfig.addConnectionFactory(new FacebookConnectionFactory(
       env.getProperty("facebook.app.id"), 
       env.getProperty("facebook.app.secret") 

     ));*/ 
     final FacebookConnectionFactory fbcf = new FacebookConnectionFactory(env.getProperty("facebook.app.id"), 
       env.getProperty("facebook.app.secret")); 
       fbcf.setScope("email"); 
       cfConfig.addConnectionFactory(fbcf); 
     } 

    /** 
    * The UserIdSource determines the account ID of the user. The example application 
    * uses the username as the account ID. 
    */ 
    public UserIdSource getUserIdSource() { 
     return new AuthenticationNameUserIdSource(); 
    } 

    public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { 
     return new JdbcUsersConnectionRepository(
       dataSource, 
       connectionFactoryLocator, 
       /** 
       * The TextEncryptor object encrypts the authorization details of the connection. In 
       * our example, the authorization details are stored as plain text. 
       * DO NOT USE THIS IN PRODUCTION. 
       */ 
       Encryptors.noOpText() 
     ); 
    } 

    /** 
    * This bean manages the connection flow between the account provider and 
    * the example application. 
    */ 
    @Bean 
    public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) { 
     return new ConnectController(connectionFactoryLocator, connectionRepository); 
    } 

/* @Bean 
    public CanvasSignInController canvasSignInController(ConnectionFactoryLocator connectionFactoryLocator, 
      UsersConnectionRepository usersConnectionRepository, Environment env) 
    { 
     return new CanvasSignInController(connectionFactoryLocator, usersConnectionRepository, 
       new SimpleSignInAdapter(), env.getProperty("facebook.appKey"), env.getProperty("facebook.appSecret"), 
       env.getProperty("facebook.canvasPage")); 
    }*/ 
} 

在Facebook登录后,接下来我们尝试像

WebRequest request 
RegistrationForm dto = new RegistrationForm(); 
Connection<?> connection = ProviderSignInUtils.getConnection(request); 

if (connection != null) { 
      UserProfile socialMediaProfile = connection.fetchUserProfile(); 
      System.out.println("DTO EMAIL--->"+socialMediaProfile.getEmail()); 
      dto.setEmail(socialMediaProfile.getEmail()); 
      dto.setFirstName(socialMediaProfile.getFirstName()); 
      dto.setLastName(socialMediaProfile.getLastName()); 
    } 

我试图让电子邮件和用户名来获取用户的个人资料,但并不working.And名字和姓氏正确提取。

+0

你是什么意思与*“我尝试配置电子邮件和用户名范围,但不起作用。“*?目前我不知道你想做什么。 – 2014-09-24 08:03:24

+0

我已更新我的代码。 – user2823228 2014-09-24 08:59:20

回答

0

我相信这是目前春季社交版的一个bug。它目前正在这里追踪: https://jira.spring.io/browse/SOCIAL-436

在此期间,你可以通过这样您的网页上通过隐藏字段设置范围解决这个问题:

<form action="<c:url value="/connect/facebook" />" method="POST"> 
    <input type="hidden" name="scope" value="email" /> 
    <p>You haven't created any connections with Facebook yet. Click the button to create 
     a connection between your account and your Facebook profile.</p> 
    <p><button type="submit"><img src="<c:url value="/resources/social/facebook/signin.png" />"/> 
    </button></p> 
</form>