4

数日間、Facebook をアプリケーションに統合する作業を行ってきました。接続が正常に機能し、Facebook ログイン後にユーザーをデータベースにコピーし、後でコンテキスト内で内部プリンシパルを使用したいと考えています。


Spring セキュリティ ログインの場合、authentication-managerをクラス implementing でオーバーロードし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


質問: すべてのコントローラでこれらのタイプを区別したくありません。なんで違うの!? 通常の資格情報でログインした場合、これは明らかに User (私のタイプ) オブジェクトであり、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 に答える