Próba zrozumienia, jaki jest prawidłowy sposób implementacji uwierzytelniania OpenID w 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) {
...
}
}
Rozważam scenariusz, gdy użytkownik nie jest jeszcze zarejestrowany w mojej aplikacji. Aby zarejestrować użytkownika, muszę znać jego identyfikator OpenID i adres e-mail.
Gdy dostawca OpenID przekierowuje użytkownika z powrotem do mojej aplikacji, wywoływana jest nazwa loadUserByUsername()
, ale w tym przypadku mam świadomość tylko tego, że OpenID użytkownika. Tak więc rzucam UsernameNotFoundException
, a następnie loadUserDetails()
nigdy nie zostanie wywołany, więc nie mogę zarejestrować użytkownika.
Jakie jest wspólne rozwiązanie? Co się stanie, jeśli zwrócę coś w rodzaju FakePartialUserDetails
z loadUserByUsername()
, a następnie, gdy zostanie wywołana loadUserDetails()
, zarejestruję użytkownika, a następnie zwrócę rzeczywistą wartość MyCustomUserDetails
?
Używam Wiosna Zabezpieczenia 3.0.7.RELEASE
To nie jest poprawne. W wersji 3.1 narzędzie OpenIDAuthenticationProvider ma ustawione opcje dla usługi UserDetailsService i AuthenticationUserDetailsService i wywołuje metodę loadUserByUsername lub loadUserDetails w zależności od używanego programu ustawiającego. W wersji 3.0.7 program uwierzytelniającyUserDetailsService nie był ustawiony i dlatego zawsze używał loadUserByUsername. – Ritesh