2013-08-13 9 views
16

Wiem, że odpowiedziano tak wiele razy, ale jestem zdezorientowany. Mam już mechanizm uwierzytelniania w mojej aplikacji i chcę po prostu użyć części autoryzacyjnej Spring MVC. Używam Spring MVC 3 i Spring Security 3.Jak zaimplementować uwierzytelnianie niestandardowe w Spring Security 3?

Kiedy szukam w Internecie, znalazłem dwa rozwiązania, pierwszy to implementacja interfejsu AuthenticationProvider. Example1. Drugim jest implementacja UserDetails i UserDetailsService, Example2, więc jestem tutaj zagubiony.

---- Aktualizacja ----

Druga część pytania jest here. I rozwiązanie tego obejścia.

Odpowiedz

37

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); 
} 

} 
+0

dam wiedzieć, czy to działa. Dzięki. –

+0

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. –

+0

Moja sugestia polegałaby na podklasach DAOAuthenticationManager, zastąpieniu metody uwierzytelniania i po prostu wywołaniu super.authenticate w próbie catch. – Nils

Powiązane problemy