Versuchen zu verstehen, wie die OpenID-Authentifizierung mit Spring Security korrekt implementiert wird.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) {
...
}
}
Ich denke über das Szenario nach, wenn der Benutzer noch nicht in meiner Anwendung registriert ist. Um den Benutzer zu registrieren, muss ich seine OpenID und E-Mail kennen.
Wenn OpenID-Anbieter den Benutzer zurück zu meiner Anwendung leitet, wird loadUserByUsername()
aufgerufen, aber in diesem Fall bin ich nur über die OpenID des Benutzers bekannt. Also, ich werfe UsernameNotFoundException
und dann loadUserDetails()
wird nie aufgerufen, so kann ich nicht Benutzer registrieren.
Was ist die gemeinsame Lösung hier? Was passiert, wenn ich etwas wie FakePartialUserDetails
von loadUserByUsername()
zurückgebe und dann, wenn loadUserDetails()
aufgerufen wird, registriere ich den Benutzer und dann die echte MyCustomUserDetails
?
Ich verwende Spring Security 3.0.7.RELEASE
Dies ist nicht korrekt. In 3.1 hat OpenIDAuthenticationProvider Setter für UserDetailsService und AuthenticationUserDetailsService und ruft entweder loadUserByUsername oder loadUserDetails auf, abhängig davon, welcher Setter verwendet wird. In 3.0.7 gab es keinen Setter für AuthenticationUserDetailsService und daher wurde immer loadUserByUsername verwendet. – Ritesh