Spring OpenID Security - UserDetailsService, AuthenticationUserDetailsService

Trying to figure out how to properly implement OpenID authentication with Spring Security.

public class OpenIDUserDetailsService implements 
  UserDetailsService, 
  AuthenticationUserDetailsService {

  @Override
  public UserDetails loadUserByUsername(String openId) throws
    UsernameNotFoundException, DataAccessException {

    // I either want user email here
    // or immediately delegate the request to loadUserDetails

  }

  @Override
  public UserDetails loadUserDetails(Authentication token) throws
    UsernameNotFoundException {

    // This never gets called if I throw from loadUserByUsername()

  }

  private MyCustomUserDetails registerUser(String openId, String email) {
    ...
  }
}

I am considering a scenario where a user is not already registered in my application. To register a user, I need to know his OpenID and email.

When the OpenID provider redirects the user back to my application, it is called loadUserByUsername(), but in this case I only know about the OpenID user. So, I quit UsernameNotFoundExceptionand then loadUserDetails()never get called, so I can not register the user.

? , - FakePartialUserDetails loadUserByUsername(), , loadUserDetails(), , MyCustomUserDetails?

Spring Security 3.0.7.RELEASE

+5
2

, , Spring Security 3.1.0.RELEASE.

- loadUserByUsername() loadUserDetails().

+1

,

AuthenticationUserDetailsService<OpenIDAuthenticationToken>

UserDetailsService.

public class OpenIdUserDetailsService implements UserDetailsService,
    AuthenticationUserDetailsService<OpenIDAuthenticationToken> {

@Autowired(required = true)
@Qualifier(value = "jdbcUserDetailsService")
private UserDetailsService localUserDetailsService;

/**
 * @return the localUserDetailsService
 */
public UserDetailsService getLocalUserDetailsService() {
    return localUserDetailsService;
}

/**
 * @param localUserDetailsService
 *            the localUserDetailsService to set
 */
public void setLocalUserDetailsService(
        UserDetailsService localUserDetailsService) {
    this.localUserDetailsService = localUserDetailsService;
}

@Override
public UserDetails loadUserDetails(OpenIDAuthenticationToken token)
        throws UsernameNotFoundException {
    String email = getEmail(token);
    return loadUserByUsername(email);
}

@Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {
    return localUserDetailsService.loadUserByUsername(username);
}

private String getEmail(OpenIDAuthenticationToken token) {
    for (OpenIDAttribute attribute : token.getAttributes()) {
        if (attribute.getName().equals("email")) {
            return attribute.getValues().get(0);
        }
    }
    return null;
}

}

, UserDetailsService openid-. , "email" openid. , , "OpenIDAuthenticationToken", loadUserByUsername.

, . , .

0

All Articles