Tôi đang xây dựng ứng dụng dựa trên nền tảng bảo mật mùa xuân dựa trên mvc và mùa xuân.Buộc người dùng thay đổi mật khẩu đã hết hạn trong bảo mật mùa xuân
Tôi đã thực hiện chức năng Đặt lại mật khẩu. Quản trị viên hệ thống sẽ đặt lại mật khẩu của bất kỳ người dùng nào. Mật khẩu được tạo ngẫu nhiên sẽ được gửi qua email cho người dùng và sẽ được cập nhật trong cơ sở dữ liệu.
Bây giờ tôi muốn bất cứ khi nào người dùng đăng nhập bằng mật khẩu được tạo ngẫu nhiên, tôi muốn buộc người dùng thay đổi mật khẩu của nó.
Vui lòng xem qua số người dùng TABLE của tôi.
userid bigint (20)
tên varchar (20)
mật khẩu varchar (65)
email varchar (50)
firstname varchar (20)
lastname varchar (20)
groupname varchar (50)
kích hoạt tinyint (1)
credentialsNonExpired tinyint (1)
Authenticat MY ion cung cấp
<!--
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>
Tôi đã sử dụng JDBCUserDetailsService mở rộng JDBCDaoImpl như jdbcUserService.
Tôi muốn đặt số thông tin xác thựcNonExpired thành cột sai của bảng người dùng khi tôi đặt lại mật khẩu.
Tôi có thể làm điều đó.
Nhưng khi tôi đăng nhập, bảo mật mùa xuân JDBCuserdetailsservice loadUserbyUsername chỉ nhận tên người dùng, mật khẩu, cột được bật và phần còn lại của tất cả các trường được đặt thành 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);
}
});
}
Nhưng tôi muốn thực tế credentialNonExpired lĩnh vực được thiết lập bởi mật khẩu reset, do đó an ninh mùa xuân sẽ ném CREDENTIALEXPIREDEXCEPTION.
Tôi đạt được điều đó bằng cách tải phương thức trên, nhưng có cách nào khác để chuyển hướng người dùng để thay đổi trang mật khẩu khi họ đăng nhập bằng mật khẩu hết hạn.
Vui lòng cho tôi biết cách tôi có thể làm điều đó?
Tôi đang làm việc trên một vấn đề rất giống và đi xuống con đường này ... có đề xuất nào về cách xử lý logic thay đổi mật khẩu tốt nhất không? Có vẻ như đang cố gắng sao chép tất cả chức năng "đăng nhập" bình thường (kiểm tra mật khẩu, điền vào SecurityContextHolder, trả về mã lỗi) có thể gặp khó khăn ... – bimsapi
Tôi đang làm việc với JPA và các mô hình. toàn bộ chu kỳ bảo mật của Spring. Dường như với tôi là cách nhanh nhất. Tất nhiên sau khi thay đổi mật khẩu, tôi chuyển hướng người dùng đến trang đăng nhập. –
Vâng, tôi nghĩ cách của bạn sẽ nhanh hơn :) Đây là những gì tôi đã làm - * 'Tên người dùngPasswordResetAuthentication' với tên người dùng, mật khẩu và mật khẩu mới * Trang đăng nhập mới/xác nhận mật khẩu khi thích hợp * Đăng nhập bộ lọc tạo đối tượng xác thực phù hợp, dựa trên yêu cầu * Trình xác thực tùy chỉnh (đã có vì các lý do khác nhau), mở rộng thành 1) xác thực bằng mật khẩu hiện có, 2) cập nhật mật khẩu đã lưu và 3) xác thực lại bằng mật khẩu mới . – bimsapi