2013-03-18 4 views
4

며칠 동안 나는 Facebook과 애플리케이션을 통합하는 작업을 수행 해왔다. 성공적으로 연결을 만들었고 Facebook 로그인 후 사용자를 데이터베이스로 복사 한 다음 컨텍스트 내에서 내부 사용자를 사용하고 싶습니다. 봄 보안 로그인에 'in-bean'로그인 방법을 사용할 때 스프링 보안 컨텍스트의 다른 보안 주체


우리는 우리의 클래스가 UserDetailsService를 위치 : implemeting 우리의 인증 관리자 오버로드.

누군가 페이스 북으로 로그인하면 그는 알 수없는 추상적 인 자격증을 가지고 있습니다.

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.springframew[email protected]4527d081: Principal: [email protected]: Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]21a2c: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: A5E9AB9E4AEE7486EC4B4F6133F77320; Granted Authorities: ROLE_ADMIN

그러나 컨트롤러의 방법에 로그인 후

의 : org.springframew[email protected]cd4699c5: Principal: 1405308431; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_CLIENT


질문 :,모든 컨트롤러에서 이러한 유형을 구별하고 싶지 않습니다. 왜 다른가?! 그것은 분명히 우리가 정상적인 자격 증명으로 로그인 할 때 사용자 (내 타입) 객체이고 그 페이스 북만을위한 String입니다. 페이스 북 로그인이 내 보안 컨텍스트에서 User 객체를 제공하도록 어떻게 변경합니까?

답변

3

this chapiter 끝에 설명 된대로 SignInAdapter를 설정해야합니다. SignInAdapter.signIn(...) 메서드에서는 DB에서 사용자 개체를로드 한 다음 인증 개체를 준비하고 보안 컨텍스트 소유자에게 주입 할 수 있습니다.

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; 
} 

} 

지금은 내가조차 가질 수 이해 단지 올바른 클래스로 Object principal을 제공 UsernamePasswordAuthenticationToken, 을 이용해야합니다 미래의 설명 이 예제를 게시 할 수 있습니다. 바보 나.