2011-12-16 16 views
8

Mam wdrożony Spring Security w mojej aplikacji. Użyłem domyślnej implementacji, tj. Skonfigurowałem ją z własnymi parametrami (DataSource, Secured Areas, itp.), Ale nie napisałem żadnej niestandardowej implementacji.Uzyskaj więcej informacji od użytkownika - Spring Security

Teraz chcę przechwycić więcej danych od użytkownika, to jest na tej samej tabeli, co nazwa użytkownika i hasło, takie jak nazwa firmy, identyfikator itp. Jednak nie chcę używać tych informacji w celu zalogowania.

Nie jestem pewien, jak to zrobić. Z tego, co przeczytałem, jest związana z UserDetailsService. Wydaje się jednak, że napisanie Custom UserDetailsService byłoby konieczne, gdybym chciał użyć tych informacji podczas logowania i nie tego chcę. Po prostu chcę użyć tych informacji w aplikacji, po zalogowaniu się użytkownika.

Czy to jest naprawdę powiązane z UserDetailsServer? Czy to jedyny plik, który muszę zmodyfikować?

Wszystkie przykłady znalazłem niestandardowych UserDetailsService prostu stosować nazwę użytkownika i hasło, więc nie mogę zrozumieć, gdzie nowe dane przyjdzie w.

Dzięki!

Odpowiedz

14

Zastępowanie UserDetailsService to, co zrobiliśmy .. Musisz zaimplementować własną UserDetailsService i własne UserDetails obiektu:

public class CustomService implements UserDetailsService { 
    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) { 

     Account account = accountDAO.findAccountByName(username); 

     if (account == null) { 
      throw new UsernameNotFoundException("account name not found"); 
     } 
     return buildUserFromAccount(account); 
    } 


    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true) 
    private User buildUserFromAccount(Account account) { 

     String username = account.getUsername(); 
     String password = account.getPassword(); 
     boolean enabled = account.getEnabled(); 
     boolean accountNonExpired = account.getAccountNonExpired(); 
     boolean credentialsNonExpired = account.getCredentialsNonExpired(); 
     boolean accountNonLocked = account.getAccountNonLocked(); 

     // additional information goes here 
     String companyName = companyDAO.getCompanyName(account); 


     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     for (Role role : account.getRoles()) { 
      authorities.add(new SimpleGrantedAuthority(role.getName())); 
     } 

     CustomUserDetails user = new CustomUserDetails (username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, 
       authorities, company); 

     return user; 
    } 


public class CustomUserDetails extends User{ 

    // ... 
    public CustomUserDetails(..., String company){ 
     super(...); 
     this.company = company; 
    } 

    private String company; 

    public String getCompany() { return company;} 

    public void setCompany(String company) { this.company = company;} 
} 
+0

'loadUserByUsername' zwraca UserDetails, ale w kodzie, zwraca' buildUserFromAccount' która zwraca użytkownika. W jaki sposób CustomUserDetails jest zaangażowany w kod? Konto DAO i wszystkie jego metody powinny być zaimplementowane przeze mnie, prawda? –

+0

Miał trochę literówki i naprawił go. Aby wyjaśnić dalej: 'UserDetails' jest interfejsem,' Użytkownik' jest implementacją wiosennych papierów wartościowych, zawierającą wszystkie podstawowe pola. Jeśli chcesz dodać własne pola, najłatwiej jest rozszerzyć 'User'. Wciąż możesz zwrócić obiekt 'User' w tej metodzie lub obiekt' UserDetails' lub 'CustomUserDetails' jako zabezpieczenie wiosny, właśnie oczekuje obiektu implementującego' UserDetails'. – Pete

+0

Ah, Ok! Korzystając z tego, zapewniam uwierzytelnianie Spring Security. Jednak obiekt użytkownika, który ma, ma wszystkie moje niestandardowe pola. Jak uzyskać ten obiekt, więc mogę na przykład "pobraćCompany"? –

Powiązane problemy