Принуждение пользователя к изменению пароля с истекшим сроком действия в Spring Security

Я создаю веб-приложение на основе Spring mvc и безопасности Spring.

Я реализовал функцию сброса пароля. Системный администратор сбросит пароль любого пользователя.Случайно сгенерированный пароль будет отправлен пользователю по электронной почте, и он будет обновлен в базе данных.

Теперь я хочу, чтобы всякий раз, когда пользователь входил в систему со случайным сгенерированным паролем, я хочу заставить пользователя изменить свой пароль.

Пожалуйста, посмотрите мою пользовательскую ТАБЛИЦУ.

идентификатор пользователя bigint (20)
имя пользователя varchar (20)
пароль varchar (65)
электронная почта varchar (50)
имя varchar (20)
фамилия varchar (20)
имя группы varchar (50)
включен tinyint (1)
credentialsNonExpired tinyint (1)

MY Authentication Provider

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

Я использовал JDBCUserDetailsService , расширяя JDBCDaoImpl как jdbcUserService .

Я хочу установить credentialNonExpired в столбец false в моей таблице пользователей, когда я сбрасываю пароль.

Я могу это сделать.

Но когда я вхожу в систему, весенняя безопасность JDBCuserdetailsservice loadUserbyUsername получает только имя пользователя, пароль, разрешенные столбцы и остальные поля, установленные в значение 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);
        }

    });
}

Но мне нужно фактическое поле credentialNonExpired , которое задается паролем сброса, чтобы весенняя безопасность выдавала CREDENTIALEXPIREDEXCEPTION.

Я добиваюсь этого, загружая указанный выше метод, но есть ли другой способ перенаправить пользователя на страницу смены пароля, когда они входят в систему с истекшим паролем.

Скажите, пожалуйста, как мне это сделать?

12
задан Ketan 12 December 2011 в 05:09
поделиться