【问题标题】:Spring Security 2.0 Facebook ConnectSpring Security 2.0 Facebook 连接
【发布时间】:2012-01-21 07:41:48
【问题描述】:

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

我在我的控制器中找到了这部分代码,其中我在 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>

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

非常感谢。

***编辑: 非常感谢。看起来它可能会有所帮助。我现在在 DB 中有一个要登录的用户。我在控制器中制作了这段代码:

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 */

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

【问题讨论】:

  • 你怎么知道你没有登录?
  • 应用程序没有让我登录。我为我想登录的用户设置了错误的权限;)

标签: spring spring-mvc facebook spring-security


【解决方案1】:

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

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

在您上面提到的代码之后,将以下代码附加到同一控制器中:

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

【讨论】:

  • 非常感谢。我编辑了我的问题作为对您帖子的回复,因为我是 Stackoverflow 的新手,我无法在 24 小时内发布新的答案。
  • 看来我忘了设置授权权限 :-) 我会发布结果:-)
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2013-04-01
  • 2015-10-12
  • 2015-06-08
  • 2012-06-03
  • 2012-02-01
相关资源
最近更新 更多