2013-03-18 15 views
7

Ho questo pezzo di codiceDove dovrebbe andare la logica di autenticazione manuale in spring security - Livello di servizio o livello di presentazione?

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 
SecurityContext securityContext = SecurityContextHolder.getContext(); 
securityContext.setAuthentication(authentication); 
HttpSession session = request.getSession(true); 
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext); 

Questo è per autenticare manualmente un utente in sicurezza primavera. La mia domanda è dove dovrei inserire questo codice? Mettere questo livello di servizio mi obbliga a portare l'oggetto HttpSession sul livello di servizio che AFAIK è danneggiato. Non sono sicuro di quanto sia utile posizionare la logica di autenticazione nel livello di presentazione. Qualcuno con qualche intuizione ??

Grazie in anticipo.

+0

erm, il filtro servlet è standard, lo hai costretto di proposito solo a queste due opzioni per qualche motivo? – Affe

+0

quindi devo scrivere un filtro personalizzato? A partire da ora è una semplice richiesta GET. Devo accettare la logica all'interno di quella chiamata. – shazinltc

+0

Se si utilizza semplicemente l'autenticazione di base, è sufficiente configurare Spring per gestirlo per te. – benzonico

risposta

14

Fare riferimento alla risposta di Luke Taylor alla domanda Best practice for getting active user's UserDetails? per la logica di progettazione per la creazione di un'interfaccia personalizzata per eseguire questo tipo di operazioni mantenendo il codice disaccoppiato da Spring Security. Ad esempio, è possibile scrivere un'interfaccia denominata MyAuthenticator e scrivere l'implementazione e inserirla nella propria applicazione.

Inoltre, se i filtri di sicurezza Spring sono standard, non è necessario accedere all'oggetto HttpSession. I filtri quadro si prenderanno cura di esso. Devi solo scrivere seguente nell'implementazione:

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 

SecurityContextHolder.getContext().setAuthentication(authentication); 

non mi consiglia l'utilizzo di "SPRING_SECURITY_CONTEXT" (HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY) in quanto potrebbe cambiare nelle future versioni del quadro.

+1

perfetto !! Grazie mille :) – shazinltc

+0

Puoi chiarire cosa intendi per "i filtri di sicurezza primaverili sono standard"? – swbandit

+0

Significa che non esiste alcuna specifica personalizzazione del filtro dell'applicazione che possa influire su ... in particolare su 'SecurityContextPersistenceFilter' che è responsabile del popolamento di' SecurityContextHolder'. – Ritesh

Problemi correlati