2011-12-16 19 views
8

Implementé Spring Security en mi aplicación. He utilizado la implementación predeterminada, es decir, la he configurado con mis propios parámetros (DataSource, Secured Areas, etc.), pero no he escrito ninguna implementación personalizada.Obtenga más información del usuario - Spring Security

Ahora quiero capturar más datos del usuario, es decir, en la misma tabla que el nombre de usuario y la contraseña, como el nombre de la empresa, identificación, etc. Sin embargo, no quiero utilizar esta información para iniciar sesión.

No estoy seguro de cómo hacerlo. Por lo que he leído, está relacionado con UserDetailsService. Sin embargo, parece que sería necesario escribir un CustomDetailsService personalizado si quería utilizar esta información durante el inicio de sesión, y eso no es lo que quiero. Solo quiero usar esta información dentro de la aplicación, después de que el usuario haya iniciado sesión.

¿Está realmente relacionado con UserDetailsServer? ¿Es este el único archivo que tengo que modificar?

Todos los ejemplos que encontré de UserDetailsService medida solo utilizan nombre de usuario y contraseña, por lo que no pueden entender que los nuevos datos vendrían.

Gracias!

Respuesta

14

Anulación del UserDetailsService es lo que hicimos .. Tendrá que implementar su propio UserDetailsService y sus propias DetallesUsuario objeto:

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' vuelve DetallesUsuario, pero en el código, devuelve' buildUserFromAccount' que devuelve un usuario. Entonces, ¿cómo CustomUserDetails está involucrado en el código? La clase Account DAO y todos sus métodos deberían ser implementados por mí, ¿correcto? –

+0

Tuve un pequeño error tipográfico y lo arreglé. Para seguir explicando: 'UserDetails' es la interfaz,' User' es una implementación de valores de primavera que incluye todos los campos básicos. Si desea agregar sus propios campos, lo más fácil es extender 'User'. Todavía puede devolver un objeto 'User' en ese método o un objeto' UserDetails' o un objeto 'CustomUserDetails' ya que spring security solo espera un objeto que implemente' UserDetails'. – Pete

+0

¡Ah, vale! Así que al usar esto, estoy proporcionando todo lo que Spring Security necesita para autenticarse. Sin embargo, el objeto User que contiene tiene todos mis campos personalizados. Entonces, ¿cómo obtengo este objeto, así que puedo 'getCompany' por ejemplo? –

Cuestiones relacionadas