2014-08-19 24 views
13

Ich versuche, zusätzliche Daten in de Benutzerprinzipalobjekt zu speichern.Spring Security benutzerdefinierte UserDetailsService und benutzerdefinierte Benutzerklasse

Was ich tat, war:

Umsetzung der „Userdetails“ Schnittstelle zu meiner bestehenden Benutzerklasse, wo meine zusätzlichen Daten gespeichert werden (wie E-Mail-Adresse etc.).

@Entity 
public class User implements UserDetails { 

Dann habe ich eine UserDetailsService Implementierung:

@Service 
public class UserDetailsServiceImpl implements UserDetailsService { 

    @Autowired 
    UserDAO userDAO; 

    @Override 
    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException { 
     User user = userDAO.findOneByUsername(username); 
     if (user == null) 
      throw new UsernameNotFoundException("username " + username 
        + " not found"); 

     System.out.println("---------------------> FOUND ------------->" 
       + user.getEmail()); 

     return user; 
    } 

} 

Der letzte Schritt war die UserDetailsService in meiner Security-Konfiguration hinzuzufügen.

Ich sehe in meiner Konsole, dass "loadUserByName" zweimal aufgerufen wird (wegen der "Found" -Ausgabe).

Wenn ich versuche, die Hauptaufgabe in meinem Controller zugreifen ->

System.out.println(SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal()); 

ich meine zusätzlichen Daten nicht bekommen. Wenn ich versuche, es auf mein Benutzerobjekt zu werfen, erhalte ich eine Exception nicht.

Gibt es etwas, was ich vermisse?

Vielen Dank im Voraus.

Antwort

11

Ok. Mein Problem war in dem Code versteckt, den ich nicht postete.

Ich dachte dieser DetailsService ist nur um zusätzliche Details zu erhalten, aber es wird für die Anmeldung selbst verwendet.

Ich hatte "jdbcAuthentication" zusätzlich konfiguriert und Feder schien dies immer zu verwenden.

Jetzt, da ich nur die DetailsService konfiguriert habe, funktioniert alles gut.

bearbeiten .:

so hatte ich nur diesen Code zu löschen:

auth.jdbcAuthentication() .dataSource(dataSource) 
    * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
// .... 

Und jetzt funktioniert es auch mit meinem Code in der obigen Frage.

0

Extention Klasse erstellen:

public class CustomUserDetails extends org.springframework.security.core.userdetails.User{ 

    private User user; 

    public CustomUserDetails(User user, Collection<? extends GrantedAuthority> authorities) { 
     super(user.getName(), user.getPassword(), authorities); 
     this.user = user; 
    } 

    public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) { 
     super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
     this.user = user; 
    } 

    public User getUser() { 
     return user; 
    } 
} 

als fügen Sie UserDetailsService:

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService { 
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException { 
    UserDetails userDetails = null; 
    User user = userService.getByLogin(login); 
    userDetails = new CustomUserDetails(user, 
       true, true, true, true, 
       getAuthorities(user.getRole())); 

    return userDetails; 
} 

Get it!

(CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal() 
+0

Das änderte nichts. BTW. Ihr letzter Codeausschnitt gibt mir: "java.lang.ClassCastException: org.springframework.security.core.userdetails.User kann nicht in .......... CustomUserDetails" – jvecsei

+0

können Sie debuggen Ihre App und sagen Welche Klasse liefert 'SecurityContextHolder.getContext(). getAuthentication(). getPrincipal()'? –

+0

class org.springframework.security.core.userdetails.Benutzer – jvecsei

Verwandte Themen