gpt4 book ai didi

spring-security - spring security 强制用户修改过期密码

转载 作者:行者123 更新时间:2023-12-04 00:53:12 24 4
gpt4 key购买 nike

我正在构建基于 spring mvc 和 spring security 的基于 web 的应用程序。

我已经实现了重置密码功能。系统管理员将重置任何用户的密码。随机生成的密码将通过电子邮件发送给用户,并在数据库中更新。

现在我想每当用户使用随机生成的密码登录时,我想强制用户更改其密码。

请查看我的 用户 表。

用户 ID bigint(20)
用户名 varchar(20)
密码 varchar(65)
电子邮件 varchar(50)
名字 varchar(20)
姓氏 varchar(20)
组名 varchar(50)
启用 tinyint(1)
凭证未过期 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>

我已经使用 JDBCUserDetailsS​​ervice 扩展 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);
}

});
}

但我想要由重置密码设置的实际 credentialNonExpired 字段,以便 spring 安全性将抛出 CREDENTIALEXPIREDEXCEPTION。

我通过加载上述方法实现了这一点,但是当用户使用过期密码登录时,是否还有其他方法可以重定向用户以更改密码页面。

请告诉我我该怎么做?

最佳答案

答案很晚,我不知道您使用的是 Spring 2 还是 Spring 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>

当然,您可以将其他特定的身份验证异常映射到其他页面。

如果您使用 form-login 元素,则必须指定 authentication-failure-handler-ref属性(并删除 authentication-failure-url 如果使用)
<security:form-login ... authentication-failure-handler-ref="securityExceptionTranslationHandler">

最后一步是创建更改密码页面。

请记住,用户在重定向到更改密码页面时未经过身份验证。

关于spring-security - spring security 强制用户修改过期密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8470173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com