Cercare di capire quale sia il modo corretto di implementare l'autenticazione 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) {
...
}
}
Sto considerando lo scenario in cui l'utente non è ancora registrato all'interno della mia applicazione. Per registrare l'utente, ho bisogno di conoscere il suo OpenID e l'e-mail.
Quando il provider OpenID reindirizza l'utente alla mia applicazione, viene chiamato loadUserByUsername()
, ma in questo caso sono a conoscenza solo dell'openID dell'utente. Quindi, sto lanciando UsernameNotFoundException
e quindi non viene mai chiamato loadUserDetails()
, quindi non posso registrare l'utente.
Qual è la soluzione più comune qui? Cosa succede se restituisco qualcosa come FakePartialUserDetails
da loadUserByUsername()
e quindi, quando viene chiamato loadUserDetails()
, registro l'utente e quindi restituisco il numero reale MyCustomUserDetails
?
che sto usando Primavera di sicurezza 3.0.7.RELEASE
Questo non è corretto. In 3.1, OpenIDAuthenticationProvider ha setter sia per UserDetailsService che AuthenticationUserDetailsService e chiama loadUserByUsername o loadUserDetails a seconda del setter utilizzato. Nella 3.0.7 non esisteva un setter per AuthenticationUserDetailsService e quindi utilizzava sempre loadUserByUsername. – Ritesh