2012-06-25 22 views
5

Ho implementato la sicurezza di primavera per proteggere le sezioni del nostro sito web. Sto usando un DB (MongoDB) per memorizzare nome utente/password. Ho implementato org.springframework.security.core.userdetails.UserDetailsService per cercare i dettagli dell'account dal DB.Spring Security Accesso con una svolta: gli utenti devono attivare il proprio account prima di accedere

Ho ancora bisogno di aggiungere un'altra funzionalità: attivazione dell'account. Dopo la registrazione, inviamo un'email di attivazione a un utente e, se fa clic su di esso, contrassegniamo l'account come attivato nel DB. Gli utenti che non hanno attivato il proprio account, non devono poter accedere e devono essere reindirizzati a una pagina.

Qualche idea su come implementare? Ho bisogno di collegare in qualche modo il processo di accesso.

Grazie!

risposta

9

personalizzato AuthenticationManager non è necessario. Questa funzione è già disponibile in Spring Security. Dai uno sguardo allo doc, puoi vedere la proprietà enabled. Quando si crea l'utente, se si imposta tale proprietà su falso e l'utente tenta di accedere, Spring visualizza automaticamente un messaggio che informa l'utente che l'account non è attivo.

AGGIORNATO

Per visualizzare i messaggi di errore di Primavera, è necessario utilizzare questo nella pagina di login:

<c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" /> 
+0

Lieto di sapere

+0

grazie! Bella risposta! come faccio a sapere nel JSP che l'utente non è stato autenticato a causa dell'account non abilitato? – checklist

+0

Ho aggiornato la mia risposta. – jddsantaella

2

È possibile creare direttore di autenticazione personalizzati in cui è possibile controllare se l'utente è attivo o meno

<bean id="authenticationFilter"  class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
     p:authenticationManager-ref="customAuthenticationManager" 
     p:authenticationFailureHandler-ref="customAuthenticationFailureHandler" 
     p:authenticationSuccessHandler-ref="customAuthenticationSuccessHandler" /> 

e personalizzato AuthenticationManager

<bean id="customAuthenticationManager" 
     class="com.mycompany.security.CustomAuthenticationManager" /> 

CustomAuthenticationManager.java

public class CustomAuthenticationManager implements import org.springframework.security.authentication.AuthenticationManager{ 
     @Override 
    public Authentication authenticate(Authentication auth) 
      throws AuthenticationException { 

     User user = null; 
     if (auth.getName() == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     user = userService.getUserByUsername(auth.getName()); 
     if (user == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     if (passwordEncoder.isPasswordValid(user.getPassword(), (String) auth.getCredentials(), null)) { 
      //check if user is activated if not throw appropriate excetion 
     } else { 
      throw new BadCredentialsException("User does not exists!"); 
     } 

    } 

ed esso reindirizza utente torna alla pagina di login (se configurato correttamente)

ora in login.jsp, ottenere alla causa del disturbo da

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 

e mostrare il messaggio appropriato per utente }

+0

grazie per la risposta. Ma come potrei reindirizzare a un'altra pagina? – checklist

+0

Aggiunti ulteriori dettagli –

+2

Custom AuthenticationManager non è necessario. Dovrebbe essere utilizzata la proprietà "enable" di UserDetails. – jddsantaella

Problemi correlati