2014-07-27 1 views
12

Ho implementato l'autenticazione utente tramite Spring Security Framework e tutto funziona correttamente. Posso entrare e uscire, posso fare il login nome utente per esempio come questo:Sicurezza di sicurezza get Oggetto utente

String userName = ((UserDetails) auth.getPrincipal()).getUsername(); 

Ora voglio ottenere utente come un oggetto dal database (ho bisogno di altre proprietà utente user id e).

questo modo ho provato finora:

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

Successivamente mi sono seguente eccezione:

Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to net.viralpatel.contact.model.User 

Ecco una domanda - come posso ottenere l'utente come oggetto, come devo modificare la mia classi UserDetailsServiceImpl e UserAssembler, qualche idea?

@Component 
@Transactional 
public class UserDetailsServiceImpl implements UserDetailsService{ 

    @Autowired 
    private UserDAO userDAO; 

    @Autowired 
    private UserAssembler userAssembler; 

    private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class); 

    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     User user = userDAO.findByEmail(username); 

     if(null == user) throw new UsernameNotFoundException("User not found"); 
     return userAssembler.buildUserFromUser(user); 
    } 
} 

E un altro:

@Service("assembler") 
public class UserAssembler { 

    @Autowired 
    private UserDAO userDAO; 

    @Transactional(readOnly = true) 
    public User buildUserFromUser(net.viralpatel.contact.model.User user) { 
     String role = "ROLE_USER";//userEntityDAO.getRoleFromUserEntity(userEntity); 

     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     authorities.add(new GrantedAuthorityImpl(role)); 

     return new User(user.getLogin(), user.getPassword(), true, true, true, true, authorities); 
    } 
} 

risposta

0

sembra che la classe utente a non estendere classe org.springframework.security.core.userdetails.User di primavera.

Ecco un esempio di codice di riferimento, ho definito classe denominata come 'AuthenticUser':

public class AuthenticUser extends User { 

     public AuthenticUser(String username, String password, boolean enabled, 
     boolean accountNonExpired, boolean credentialsNonExpired, 
     boolean accountNonLocked, 
     Collection<? extends GrantedAuthority> authorities) { 

     super(username, password, enabled, accountNonExpired, credentialsNonExpired, 
      accountNonLocked, authorities); 
    } 
    ..... 
    ..... 
} 

Ora è possibile creare un oggetto di questa classe nel codice e impostarlo come parte del contesto di autenticazione Primavera , per esempio

AuthenticUser user = new AuthenticUser(username, password, .... rest of the parameters); 
    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, 
     user.getAuthorities()); 
    SecurityContextHolder.getContext().setAuthentication(authentication); 

Questo autenticherà l'utente e imposterà l'utente in Contesto di sicurezza.

+0

mia classe User è solo Entity – user3127896

+0

Come accennato, è necessario estendere La classe utente di Spring. –

+0

ho avuto errore - non esiste un costruttore predefinito per l'utente – user3127896

12

In sostanza, è necessario restituire un'implementazione di UserDetails che fornisce l'accesso al numero User.

si hanno due opzioni:

  • Aggiungi il tuo User come un campo (si può fare estenderà org.springframework.security.core.userdetails.User):

    public class UserPrincipal extends org.springframework.security.core.userdetails.User { 
        private final User user; 
        ... 
    } 
    

    e ottenere un User da quel campo:

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    User user = ((UserPrincipal) principal).getUser(); 
    
  • Creare una classe tha t estende la User e implementa UserDetails:

    public class UserPrincipal extends User implements UserDetails { 
        ... 
        public UserPrincipal(User user) { 
         // copy fields from user 
        } 
    } 
    

    Questo approccio consente di lanciare il preside a User direttamente:

    User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    
0

è necessario implementare il proprio UserDetailsService e il proprio oggetto UserDetails (secondo il vostro desiderio):

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

    Account account = accountDAO.findAccountByName(userId); 

    // validation of the account 
    if (account == null) { 
     throw new UsernameNotFoundException("not found"); 
    } 
    return buildUserFromAccount(account); 
} 


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

    // take whatever info you need 
    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;} 
} 

Nota:
Questo è predefinita implementazione di classe User voi avete bisogno di avere alcune informazioni personalizzate che si può fare una classe personalizzata e estendere la classe utente