2011-12-12 14 views
11

Estoy construyendo la primavera de mvc y la aplicación de seguridad basado en la web de primavera.Obligar al usuario a cambiar la contraseña caducada en la seguridad de primavera

He implementado la funcionalidad Restablecer contraseña. El administrador del sistema restablecerá la contraseña de cualquier usuario. La contraseña generada aleatoriamente se enviará por correo electrónico al usuario y la misma se actualizará en la base de datos.

Ahora quiero cuando el usuario inicie sesión con una contraseña generada al azar, quiero forzar al usuario a cambiar su contraseña.

Por favor, eche un vistazo a mi usuario TABLA.

ID de usuario bigint (20)
nombre de usuario varchar (20)
contraseña varchar (65)
varchar correo electrónico (50)
Nombre varchar (20)
apellido varchar (20)
nombregrupo varchar (50)
tinyint habilitado (1)
credentialsNonExpired tinyint (1)

MI Authenticat Proveedor de ion

<!-- 
     Configuring Authentication Provider to make use of spring security 
     provided Jdbc user management service 
    --> 
    <authentication-provider user-service-ref="jdbcUserService"> 
     <!-- 
      Configuring SHA-1 Password Encoding scheme to secure user credential 
     --> 
     <password-encoder ref="sha1PasswordEncoder" /> 
    </authentication-provider> 
</authentication-manager> 

he utilizado JDBCUserDetailsService extiende JDBCDaoImpl como jdbcUserService.

Quiero configurar credentialNonExpired en la columna falsa de mi tabla de usuario cuando estoy restableciendo la contraseña.

Soy capaz de hacer eso.

Pero cuando me conecto, la seguridad de primavera JDBCuserdetailsservice loadUserbyUsername recibiendo sólo nombre de usuario, contraseña, columnas habilitadas y el descanso de todos los campos establecidos en verdad.

protected List<UserDetails> loadUsersByUsername(String username) { 
    return getJdbcTemplate().query(usersByUsernameQuery, new String[] {username}, new RowMapper<UserDetails>() { 
     public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException { 
      String username = rs.getString(1); 
      String password = rs.getString(2); 
      boolean enabled = rs.getBoolean(3); 
      return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES); 
     } 

    }); 
} 

Pero quiero real credentialNonExpired campo que es fijado por restablecimiento de contraseña, por lo que la seguridad de primavera lanzará CREDENTIALEXPIREDEXCEPTION.

Lo estoy logrando cargando el método anterior, pero ¿hay alguna otra forma de redirigir al usuario para cambiar la página de contraseña cuando inician sesión con la contraseña caducada.

Por favor dígame cómo puedo hacer eso?

Respuesta

1

Puede probar la subclasificación SimpleUrlAuthenticationSuccessHandler e implementar lógica personalizada para comprobar la caducidad de la contraseña. La referencia a este SimpleUrlAuthenticationSuccessHandler podría pasarse al elemento form-login en el contexto de la aplicación.

15

Respuesta tardía y no sé si está utilizando Spring 2 o 3. Pero en Spring 3 puede hacerlo de esta manera.

incluir lo siguiente en su contexto de seguridad de primavera:

<bean id="securityExceptionTranslationHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="org.springframework.security.authentication.CredentialsExpiredException">/change_password_page</prop> 
     </props> 
    </property> 
    <property name="defaultFailureUrl" value="/login_generic_error_page"/> 
</bean> 

Por supuesto se pueden asignar otras excepciones de autenticación específicos a otras páginas.

Si está utilizando el elemento form-login, entonces usted tiene que especificar el atributo authentication-failure-handler-ref (y eliminar authentication-failure-url si se usa)

<security:form-login ... authentication-failure-handler-ref="securityExceptionTranslationHandler"> 

Y paso final es la creación de la página de cambio de contraseña.

Tenga en cuenta que el usuario no se autentica cuando se le redirige a la página de cambio de contraseña.

+0

Estoy trabajando en un problema muy similar y voy por este camino también ... ¿hay alguna recomendación sobre cómo manejar mejor la lógica de cambio de contraseña? Parece que intentar replicar todas las funciones normales de "inicio de sesión" (verificar contraseñas, rellenar SecurityContextHolder, devolver códigos de error) podría ser complicado ... – bimsapi

+1

Estoy trabajando con JPA y modelos y los estoy actualizando directamente sin pasar por el todo el ciclo de seguridad de primavera. Me pareció la forma más rápida. Por supuesto, después de cambiar la contraseña, redirijo al usuario a la página de inicio de sesión. –

+1

Sí, creo que tu camino hubiera sido más rápido :) Esto es lo que terminé haciendo - * 'UsernamePasswordResetAuthentication' con nombre de usuario, contraseña y nueva contraseña * Página de inicio de sesión con campos nuevos/confirmar contraseña cuando corresponda * Iniciar sesión filtro que crea el objeto de autenticación correcto, según la solicitud * Custom AuthenticationProvider (ya existe por diferentes motivos), extendido a 1) autenticación con la contraseña existente, 2) actualización de la contraseña almacenada, y 3) autenticación con la nueva contraseña . – bimsapi

Cuestiones relacionadas