Tratando de entender cuál es la forma correcta de implementar la autenticación OpenID con Spring Security.Spring Security OpenID - UserDetailsService, AuthenticationUserDetailsService
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) {
...
}
}
Estoy considerando el escenario cuando el usuario aún no está registrado en mi aplicación. Para registrar al usuario, necesito saber su OpenID y correo electrónico.
Cuando el proveedor de OpenID redirecciona al usuario a mi aplicación, se llama al loadUserByUsername()
, pero en este caso solo conozco el OpenID del usuario. Por lo tanto, estoy lanzando UsernameNotFoundException
y luego loadUserDetails()
nunca se llama, por lo que no puedo registrar usuario.
¿Cuál es la solución común aquí? ¿Qué sucede si devuelvo algo como FakePartialUserDetails
de loadUserByUsername()
y luego, cuando se llama al loadUserDetails()
, registro al usuario y luego devuelvo el MyCustomUserDetails
real?
estoy usando Spring Security 3.0.7.RELEASE
Esto no es correcto. En 3.1, OpenIDAuthenticationProvider tiene configuradores para UserDetailsService y AuthenticationUserDetailsService y llama a loadUserByUsername o loadUserDetails dependiendo del setter que se use. En 3.0.7, no existía un setter para AuthenticationUserDetailsService y siempre usaba loadUserByUsername. – Ritesh