2011-12-12 12 views
11

Sto costruendo un'applicazione basata su web a molla mvc e sicurezza a molla.Forzare l'utente a cambiare la password scaduta nella sicurezza di primavera

Ho implementato la funzionalità Reimposta password. L'amministratore di sistema reimposterà la password di qualsiasi utente. La password generata verrà inviata all'utente e la stessa verrà aggiornata nel database.

Ora voglio ogni volta che l'utente effettua il login con password generata casualmente, voglio costringere l'utente a cambiare la sua password.

Si prega di dare un'occhiata al mio utente TABELLA.

userid bigint (20)
nome utente varchar (20)
la password varchar (65)
email varchar (50)
cognome varchar (20)
cognome varchar (20)
nomegruppo varchar (50)
tinyint abilitato (1)
credentialsNonExpired tinyint (1)

MY Authenticat Provider ioni

<!-- 
     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> 

ho usato JDBCUserDetailsService estendere JDBCDaoImpl come jdbcUserService.

Voglio impostare credentialNonExpired a false colonne della mia tabella utente quando sto reimpostando la password.

Sono in grado di farlo.

Ma quando eseguo il login, sicurezza primavera JDBCuserdetailsservice loadUserbyUsername ottenere solo nome utente, password, colonne abilitate e resto di tutti i campi impostati su true.

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); 
     } 

    }); 
} 

Ma io voglio attuale credentialNonExpired campo che è impostato per la reimpostazione della password, in modo che la sicurezza primavera lancerà CREDENTIALEXPIREDEXCEPTION.

Lo sto raggiungendo caricando il metodo di cui sopra, ma c'è un altro modo per reindirizzare l'utente per cambiare la pagina della password quando accedono con la password scaduta.

Per favore dimmi come posso farlo?

risposta

1

È possibile provare la sottoclasse SimpleUrlAuthenticationSuccessHandler e implementare la logica personalizzata per controllare la scadenza della password. Il riferimento a questo SimpleUrlAuthenticationSuccessHandler potrebbe essere passato all'elemento login form nel contesto dell'applicazione.

15

Risposta abbastanza tarda e non so se stai usando Spring 2 o 3. Ma in primavera 3 puoi farlo in questo modo.

includere quanto segue nel contesto di protezione 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> 

Naturalmente è possibile mappare altre eccezioni specifiche di autenticazione ad altre pagine.

Se si sta utilizzando l'elemento form-login, quindi è necessario specificare l'attributo authentication-failure-handler-ref (e rimuovere authentication-failure-url se utilizzato)

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

E passo finale è quello di creare la pagina di modifica della password.

Ricordare che l'utente non è autenticato quando viene reindirizzato alla pagina di modifica della password.

+0

Sto lavorando a un problema molto simile e sto seguendo questo percorso ... c'è una raccomandazione su come gestire al meglio la logica della password di modifica? Sembra provare a replicare tutte le normali funzionalità di "accesso" (controllare le password, compilare SecurityContextHolder, restituire i codici di errore) potrebbe essere complicato ... – bimsapi

+1

Sto lavorando con JPA e modelli e sto aggiornando questi direttamente senza passare attraverso il intero ciclo di sicurezza di primavera. Mi è sembrato il modo più veloce. Ovviamente dopo aver cambiato la password, reindirizzo l'utente alla pagina di accesso. –

+1

Sì, penso che la tua strada sarebbe stata più veloce :) Ecco cosa ho finito per fare - * 'UsernamePasswordResetAuthentication' con nome utente, password e nuova password * Pagina di accesso con nuovi campi/conferma password quando opportuno * Accesso filtro che crea l'oggetto di autenticazione corretto, in base alla richiesta * Custom AuthenticationProvider (già presente per motivi diversi), esteso a 1) autenticarsi con password esistente, 2) aggiornare la password memorizzata e 3) re-autenticare con la nuova password . – bimsapi

Problemi correlati