私は春の mvc と春のセキュリティ ベースの web ベースのアプリケーションを構築しています。
パスワードのリセット機能を実装しました。システム管理者は任意のユーザーのパスワードをリセットします。ランダムに生成されたパスワードはユーザーに電子メールで送信され、データベースで更新されます。
ランダムに生成されたパスワードでユーザーがログインするたびに、ユーザーにパスワードの変更を強制したい。
私のユーザーTABLEを見てください。
userid bigint(20)
username varchar(20)
password varchar(65)
email varchar(50)
firstname varchar(20)
lastname varchar(20)
groupname varchar(50)
enabled tinyint(1)
credentialsNonExpired tinyint(1)
私の認証プロバイダー
<!--
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>
JDBCDaoImplをjdbcUserServiceとして拡張するJDBCUserDetailsServiceを使用しました。
パスワードをリセットするときに、 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);
}
});
}
しかし、春のセキュリティがCREDENTIALEXPIREDEXCEPTIONをスローするように、パスワードのリセットによって設定される実際のcredentialNonExpiredフィールドが必要です。
上記の方法をロードすることでそれを達成していますが、期限切れのパスワードでログインしたときにユーザーをパスワード変更ページにリダイレクトする他の方法はありますか。
どうすればそれができるか教えてください。