Ket*_*tan 12 change-password spring-security
我正在构建基于网络的应用程序的spring mvc和spring security.
我已经实现了重置密码功能.系统管理员将重置任何用户的密码.随机生成的密码将通过电子邮件发送给用户,同样将在数据库中更新.
现在我希望每当用户使用随机生成的密码登录时,我想强制用户更改其密码.
请查看我的用户 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>
Run Code Online (Sandbox Code Playgroud)
我使用JDBCUserDetailsService将JDBCDaoImpl扩展为jdbcUserService.
我想在重置密码时将credentialNonExpired设置为我的用户表的false列.
我能够做到这一点.
但是当我登录时,spring security 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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是我想要通过重置密码设置的实际credentialNonExpired字段,以便spring安全性将抛出CREDENTIALEXPIREDEXCEPTION.
我通过加载上述方法实现了这一点,但是当用密码过期登录时,是否还有其他方法可以重定向用户更改密码页面.
请告诉我该怎么做?
Adr*_*Ber 15
很晚才回答,我不知道你是使用Spring 2还是3.但是在Spring 3你可以这样做.
在Spring安全上下文中包含以下内容:
<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>
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其他特定身份验证例外映射到其他页面.
如果您正在使用form-login元素,那么您必须指定authentication-failure-handler-ref属性(authentication-failure-url如果使用则删除)
<security:form-login ... authentication-failure-handler-ref="securityExceptionTranslationHandler">
Run Code Online (Sandbox Code Playgroud)
最后一步是创建更改密码页面.
请记住,重定向到更改密码页面时,用户未经过身份验证.
您可以尝试子类化SimpleUrlAuthenticationSuccessHandler并实现自定义逻辑来检查密码过期。对此的引用SimpleUrlAuthenticationSuccessHandler可以传递到应用程序上下文中的 form-login 元素。
| 归档时间: |
|
| 查看次数: |
13334 次 |
| 最近记录: |