4

几天来,我一直致力于将 Facebook 与我们的应用程序集成。我已成功建立连接,现在在 Facebook 登录后,我将用户复制到我们的数据库,稍后我想在 context 中使用我们的内部主体


对于 Spring 安全登录,我们用我们的类实现重载了身份验证管理器UserDetailsService

当有人使用 facebook 登录时,他有他不知道的抽象凭据。我在我的 Facebook 登录控制器中使用了这个方法让他登录:

Authentication auth = new UsernamePasswordAuthenticationToken(
    profile.getId(), new Md5PasswordEncoder().encodePassword(
    profile.getEmail() + profile.getId(), null),
    (Collection<? extends GrantedAuthority>) getAuthorities(profile.getId()));

问题:

在我使用的一些控制器中

public String profile(Locale locale, Model model, HttpSession session, Principal principal)然后principal 实际上包含不同的对象。

对于常规春季安全登录,其:

org.springframework.security.authentication.UsernamePasswordAuthenticationToken@4527d081: Principal: org.springframework.security.core.userdetails.User@586034f: Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@21a2c: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: A5E9AB9E4AEE7486EC4B4F6133F77320; Granted Authorities: ROLE_ADMIN

但是在使用控制器中的方法登录后: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@cd4699c5: Principal: 1405308431; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_CLIENT


问题: 我真的不想在所有控制器中区分这些类型。为什么不一样?!当我们使用普通凭据登录时,它显然是一个用户(我的类型)对象,它只是 facebook 的一个字符串。如何更改它,以便 facebook 登录也会在我的安全上下文中为我提供 User 对象?

4

2 回答 2

3

您需要按照本章末尾的说明设置SignInAdapter。在该SignInAdapter.signIn(...)方法中,您可以从 DB 加载用户对象,然后准备身份验证对象并将其注入安全上下文持有者。

于 2013-03-18T11:07:11.957 回答
1

一开始我并没有真正得到“准备身份验证对象”,但这真的很容易;我发布此示例以供将来澄清,也许有人会需要它:)

public class FacebookAuthenticationToken extends AbstractAuthenticationToken 
{   
private final org.springframework.security.core.userdetails.UserDetails principal;
private String credentials;

public FacebookAuthenticationToken(org.springframework.security.core.userdetails.UserDetails details,FacebookProfile profile, Collection<? extends GrantedAuthority> authorities){
    super(authorities);
    this.principal = details;
    this.credentials = new Md5PasswordEncoder().encodePassword(profile.getEmail()+profile.getId(), null);
    super.setAuthenticated(true); // must use super, as we override
}

private static final long serialVersionUID = -7545290433068513777L;

public Object getCredentials() {
    return this.credentials;
}

public Object getPrincipal() {
    return this.principal;
}

}

现在我明白我什至可以使用UsernamePasswordAuthenticationToken,只需提供Object principal正确的类。傻我。

于 2013-03-18T15:21:21.223 回答