spring security 密码过期强制修改密码
时间:2022-07-22
本文章向大家介绍spring security 密码过期强制修改密码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 定义认证失败处理器处理CredentialsExpiredException密码过期异常
public class AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
public AuthenticationFailureHandler() {
super("/login?error");
}
@Override
public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse res, AuthenticationException ex) throws IOException, ServletException {
if (ex instanceof CredentialsExpiredException) {
// 保存异常信息到会话属性,供页面显示
saveException(req, ex);
String userName = req.getParameter("username");
// 跳转到修改密码页面
res.sendRedirect("/changepassword?error&username=" + userName);
} else {
// 其他错误使用默认处理
super.onAuthenticationFailure(req, res, ex);
}
}
}
- 修改WebSecurity配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
protected void configure(HttpSecurity http) throws Exception {
...
http.formLogin().loginPage("/login")
// 注册认证失败处理器
.failureHandler(new AuthenticationFailureHandler())
...
http.authorizeRequests()
// 设置修改密码端点无需授权访问
.antMatchers("/changepassword").permitAll()
...
}
...
}
- 定义修改密码端点
@Controller
public class ChangePasswordController {
@Autowired
private UserService userService;
// 修改密码页面
@GetMapping("/changepassword")
public ModelAndView changepassword(String username) {
ModelAndView mv = new ModelAndView("changepassword");
mv.getModel().put("username", username);
return mv;
}
// 修改密码
@PostMapping("/changepassword")
public void changepassword(String username, String oldPassword, String newPassword, HttpServletRequest request, HttpServletResponse res) throws IOException {
try {
userService.changePassword(username, oldPassword, newPassword);
// 修改成功跳转到登陆页面
request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, new AuthenticationException("密码修改成功,请重新登陆"));
res.sendRedirect("/login");
} catch (Exception e) {
// 修改失败返回错误信息
request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, e);
res.sendRedirect("/changepassword?error");
}
}
}
- 定义修改密码页面
<!-- 显示错误信息 -->
<div class="alert alert-danger" role="alert"
th:text="${session.SPRING_SECURITY_LAST_EXCEPTION.getMessage()}"
th:if="${session.SPRING_SECURITY_LAST_EXCEPTION!=null}"></div>
<!-- 修改密码表单 -->
<form class="form-signin" method="post" action="/changepassword"
onsubmit='return checkForm()'>
<input type="text" id="username" name="username"
class="form-control" placeholder="用户名" required th:value="${username}">
<input type="password" id="oldPassword" name="oldPassword"
class="form-control" placeholder="原密码" required>
<input type="password" id="newPassword" name="newPassword"
class="form-control" placeholder="新密码" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">确认修改</button>
</form>
- Novell 发布Mono 1.2 推动.NET跨平台
- 【Java SE】Java NIO系列教程(十一) Pipe
- 仿qq最新侧滑菜单
- 【高能】用PyMC3进行贝叶斯统计分析(代码+实例)
- 【Java SE】Java NIO系列教程(十二)Java NIO与IO
- 【贝叶斯系列】预测未来回报的交易算法基于Bayesian cone
- android viewgroup事件分发机制
- Rafy 领域实体框架示例(1) - 转换传统三层应用程序
- android view事件分发机制
- Rafy 领域实体框架演示(2) - 新功能展示
- ormlite介绍一
- 从Encoder到Decoder实现Seq2Seq模型(算法+代码)
- 【Java SE】Java NIO系列教程(六) Selector
- Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 09-4 更改用户密码
- 10-3 信号
- 11-1 环境中存储的是什么?
- 【Rust日报】2020-08-07 无船同志关于Rust未来Generator语法的新尝试
- 11-2 环境是如何建立的
- 11-3 激活修改
- 12-1 定制提示符
- MySQL INSERT的4种形态
- PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
- Java开发必备 Git 分支开发:规范指南及完全学会Git的24堂课笔记
- 聊聊dubbo-go的failbackCluster
- 视频综合管理平台EasyNVS通道列表如何获得RTMP地址和RTSP地址?
- 【每周一库】 rust-ftp - an FTP client written in Rust
- Mall 电商实战项目发布重大更新,全面支持SpringBoot 2.3.0 !
- Python与Tableau相结合,万字长文搞定传统线下连锁店数据分析