2011-12-12 52 views
11

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 đó?

Trả lời

1

Bạn có thể thử phân lớp SimpleUrlAuthenticationSuccessHandler và triển khai logic tùy chỉnh để kiểm tra hết hạn mật khẩu. Tham chiếu đến SimpleUrlAuthenticationSuccessHandler này có thể được chuyển đến phần tử đăng nhập biểu mẫu trong ngữ cảnh ứng dụng.

15

Câu trả lời khá muộn và tôi không biết nếu bạn đang sử dụng Spring 2 hoặc 3. Nhưng vào mùa xuân 3 bạn có thể làm theo cách này.

Bao gồm những điều sau đây trong bối cảnh an ninh mùa xuân của bạn:

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

Tất nhiên bạn có thể lập bản đồ ngoại lệ xác thực cụ thể khác đến các trang khác.

Nếu bạn đang sử dụng các yếu tố hình thức-đăng nhập, sau đó bạn phải xác định thuộc tính authentication-failure-handler-ref (và loại bỏ authentication-failure-url nếu được sử dụng)

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

Và bước cuối cùng là tạo ra các trang thay đổi mật khẩu.

Hãy nhớ rằng người dùng không được xác thực khi được chuyển hướng đến trang thay đổi mật khẩu.

+0

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

+1

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. –

+1

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

Các vấn đề liên quan