W większości przypadków, gdy tylko przy użyciu nazw użytkownika i haseł do uwierzytelniania i ról do autoryzacji wystarczy zaimplementowanie własnej usługi UserDetailsService.
Przepływ uwierzytelniania hasłem nazwa jest wtedy na ogół w następujący sposób:
- filtr zabezpieczający sprężynujący (uwierzytelnianie podstawowe/forma/..) wybiera się nazwę użytkownika i hasło, odwraca go w przedmiot i UsernamePasswordAuthentication przekazuje je do AuthenticationManager
- menedżer uwierzytelniania szuka dostawcy kandydata, który może obsłużyć UsernamePasswordtokens, która w tym przypadku jest DaoAuthenticationProvider i przechodzi wzdłuż tokenu uwierzytelniania
- dostawca uwierzytelniania wywołuje metoda loadUse rByUsername interfejs i zgłasza wyjątek UsernameNotFound, jeśli użytkownik nie jest obecny lub zwraca obiekt UserDetails, który zawiera nazwę użytkownika, hasło i uprawnienia.
- Dostawca uwierzytelniania następnie porównuje hasła podanego obiektu UsernamePasswordToken i obiektu UserDetails. (może również obsługiwać hasze haseł za pomocą PasswordEncoders) Jeśli nie pasuje do tego, uwierzytelnianie nie powiedzie się. Jeśli się zgadza, rejestruje obiekt szczegółów użytkownika i przekazuje go do AccessDecisionManager, który wykonuje część autoryzacji.
Więc jeśli weryfikacja w DaoAuthenticationProvider odpowiada Twoim potrzebom. Następnie musisz tylko zaimplementować własną usługę UserDetailsService i ulepszyć weryfikację obiektu DaoAuthenticationProvider.
Przykładem dla UserDetailsService wykorzystaniem sprężyny 3.1 jest następująca:
Wiosna XML:
<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService" />
</security:authentication-manager>
<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" />
UserDetailsService Realizacja:
public MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Retrieve the user from wherever you store it, e.g. a database
MyUserClass user = ...;
if (user == null) {
throw new UsernameNotFoundException("Invalid username/password.");
}
Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3");
return new User(user.getUsername(), user.getPassword(), authorities);
}
}
dam wiedzieć, czy to działa. Dzięki. –
W ten sposób nie mogę dostosować obiegu pracy logowania. Powiedzmy, że chcę zablokować użytkownika w 5. próbie lub wysłać e-mail. Właśnie tego szukam. –
Moja sugestia polegałaby na podklasach DAOAuthenticationManager, zastąpieniu metody uwierzytelniania i po prostu wywołaniu super.authenticate w próbie catch. – Nils