2012-06-25 15 views
5

Implementé Spring Safety para proteger secciones de nuestro sitio web. Estoy usando una base de datos (MongoDB) para almacenar nombre de usuario/contraseña. Implementé org.springframework.security.core.userdetails.UserDetailsService para buscar los detalles de la cuenta del DB.Spring Security Inicie sesión con un giro: los usuarios deben activar su cuenta antes de iniciar sesión

Todavía necesito agregar otra característica: activación de la cuenta. Después del registro, enviamos un correo electrónico de activación a un usuario y, si hace clic en él, marcamos la cuenta como activada en la base de datos. Los usuarios que no han activado su cuenta no deberían poder iniciar sesión y deberían ser redirigidos a una página para eso.

¿Alguna idea sobre cómo implementar? Necesito engancharme de algún modo en el proceso de inicio de sesión.

Gracias!

Respuesta

9

personalizada AuthenticationManager no es necesario. Esta función ya está disponible en Spring Security. Eche un vistazo al doc, puede ver la propiedad enabled. Cuando crea el usuario, si establece esa propiedad en falso y el usuario intenta iniciar sesión, Spring mostrará automáticamente un mensaje que informa al usuario que esa cuenta no está activa.

ACTUALIZADO

Con el fin de mostrar mensajes de error primavera, se debe utilizar esto en la página de inicio de sesión:

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

Me alegra saber

+0

gracias! ¡gran respuesta! ¿Cómo sabría en el JSP que el usuario no fue autenticado debido a que la cuenta no está habilitada? – checklist

+0

Actualicé mi respuesta. – jddsantaella

2

Puede crear gestor de autenticación personalizado donde se puede comprobar si se ha activado el usuario o no

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

y costumbre 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!"); 
     } 

    } 

y redirigirá usuario de vuelta a la página de acceso (si está configurado correctamente)

ahora en login.jsp, obtener la causa de fallo por

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 

y mostrar el mensaje apropiado al usuario }

+0

gracias por la respuesta. ¿Pero cómo voy a redirigir a otra página? – checklist

+0

Se agregaron más detalles –

+2

Custom AuthenticationManager no es necesario. Se debe usar la propiedad "enable" de UserDetails. – jddsantaella

Cuestiones relacionadas