【发布时间】: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