Spring Security 2.0 Facebook 连接

标签 spring spring-mvc facebook spring-security

我正在尝试实现 Facebook 登录到我们基于 Spring Framework 2.5 的应用程序,该应用程序已经具有通常的登录/密码身份验证。

我在 Controller 中找到了这部分代码,其中 userFb 对象中有用户的 Facebook 数据:

String code = request.getParameter("code");
String accessToken = fbStuffKeeper.retrieveAccessToken(code);
facebookClient = new DefaultFacebookClient(accessToken);
User userFb = facebookClient.fetchObject("me", User.class);

我可以检查用户是否已经在数据库中,如果没有,我可以将他存储在数据库中并存储他的 FB_uid 和其他必要的凭据。 问题是,如果他已经获得系统授权,我想在某些条件后登录该用户。 我当前的身份验证经理按以下规则决定:

<authentication-provider>
    <jdbc-user-service data-source-ref="dataSource"
                       users-by-username-query="select username, password, confirmed, 1 AS enabled FROM person WHERE confirmed=1 and username=?"
                       authorities-by-username-query="select username, authority from person where username=?"/>
    <password-encoder hash="md5"/>
</authentication-provider>

所以我的问题是:如何登录在数据库中找到的尝试使用 Facebook 进行连接的用户?另一个身份验证提供商?有什么方法可以使用一些与我提到的类似的代码来进行登录吗?

非常感谢。

***编辑: 非常感谢。看起来可能会有帮助。我现在在数据库中有一个用户想要登录。我在 Controller 中编写了这段代码:

User userFb = facebookClient.fetchObject("me", User.class);
Person person = personDao.getPersonByFbUid(userFb.getId());
GrantedAuthority[] grantedAuthorities = new GrantedAuthorityImpl[1];
grantedAuthorities[0] = new GrantedAuthorityImpl(person.getAuthority());
Authentication a = new FacebookAuthenticationToken(grantedAuthorities, person);
a.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(a);

我还创建了 FacebookAuthenticationToken:

public class FacebookAuthenticationToken extends AbstractAuthenticationToken {
private Person person;
   public FacebookAuthenticationToken(GrantedAuthority[] authorities, Person person) {
    super(authorities);
    this.person = person;
}
public Object getCredentials() {
    return person;
}
public Object getPrincipal() {
    this.person;
} /* +  Person getter and setter */

现在一切正常。再次感谢您的帮助。

最佳答案

一种可能的方法是以下。虽然它可能不完美,但效果很好。

创建一个 FacebookAuthenticationToken 类,该类扩展 AbstractAuthenticationToken 并保存您的 Facebook 用户对象(假设它是 FacebookUser)。

在上面提到的代码之后,将以下代码添加到同一个 Controller 中:

String code = request.getParameter("code");
String accessToken = fbStuffKeeper.retrieveAccessToken(code);
facebookClient = new DefaultFacebookClient(accessToken);
User userFb = facebookClient.fetchObject("me", User.class);

// Find FacebookUser with current FB_uid, create new if found none, load its information in an instance of FacebookUser

Authentication a = new FacebookAuthenticationToken(fbUserObject);
a.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(a);

// your authentication is complete, redirect to some other page

关于Spring Security 2.0 Facebook 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636698/

相关文章:

java - 将 JSON 发布到 Spring Controller

Facebook iOS SDK 对话框参数

java - 尝试为 Spring、Spring WebFlow、Hibernate 等设置我的第一个 Maven POM,但出现错误

java - 如何将 Map 或 List<Object> 作为参数传递给 JPA 查询

java - 允许 Spring 在不同的 jars 中有多个 WebMvcConfigurer 实现

ios - 使用 Facebook 登录用户创建新帐户的最佳实践

php - Facebook 帖子的 Like_count

json - Spring 3.2 Jackson 2.2 REST API

java - JCA 或 Spring Integration/Camel 困境

java - 使用 Spring MVC 通过 AJAX 发送 HTML 数据