当前位置: 首页 > 知识库问答 >
问题:

Spring boot React JS重置密码实现

白永昌
2023-03-14

我正在尝试在我的Spring启动/反应应用程序中实现密码重置/忘记密码功能,但我在尝试完全理解它时遇到了一些问题,我不确定我采取的方法是否正确。

我已经有两个注册/登录工作

  • 我创建了一个RESTendpoint:/sendForgotPasswordEmail[POST]
    • 这将通过用户在react表单中输入的电子邮件地址查找用户,并查看是否存在包含该电子邮件的帐户
    • 如果找到用户帐户,则向他们发送一封带有唯一令牌的电子邮件,其中包含重置密码表单的链接(卡在此处)
    • 我还创建了一个生成随机UUID的令牌实体,因此当用户单击忘记密码并填写详细信息时,电子邮件会生成以下链接:http://localhost:3000/reset-密码/e90c4fa5-2e74-4b44-b3c4-5d6f1c616461
        @PostMapping("/sendForgotPasswordEmail")
        public ResponseEntity<?> sendForgotPasswordEmail(@Valid @RequestBody ForgotPasswordEmailRequest request) {
    
            User user = userService.findUserByEmailAddress(request.getForgotPasswordEmail());
            ResetPasswordToken resetPasswordToken = userService.createResetPasswordToken(user);
    
            if(userService.existsByEmailAddress(request.getForgotPasswordEmail())) {
                emailService.sendResetPasswordEmail(request.getForgotPasswordEmail(), resetPasswordToken.getToken());
                return ResponseEntity.ok(new ApiResponse("Please check your email for a password reset link" , true));
            } else {
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
            }
        }
    
    • 我创建了一个RESTendpoint: /resetPassword[POST]
      • 读取使用@Request estParam生成的令牌以检查它是否过期等。
      • 我有一个名为resetPassword(String email,字符串密码)的服务方法,它通过用户的电子邮件搜索用户并将用户密码设置为该方法提供的密码。
          @PostMapping("/resetPassword")
          public ResponseEntity<?> resetPassword(@RequestParam("token") String token, @Valid @RequestBody ForgotPasswordEmailRequest request) {
              ResetPasswordToken resetPasswordToken = userService.findByResetPasswordToken(token);
      
              if(resetPasswordToken == null) throw new BadRequestException("Invalid token");
      
              Calendar calendar = Calendar.getInstance();
      
              if((resetPasswordToken.getExpiredAt().getTime() - calendar.getTime().getTime()) <= 0) {
                  throw new BadRequestException("Link expired. Generate new link from http://localhost:3000/signup");
              }
      
              userService.resetPassword(request.getForgotPasswordEmail(), request.getNewPassword());
      
              return ResponseEntity.ok(token);
          }
      

      UserServiceImpl。java(与重置令牌相关的方法)

      
          @Override
          public ResetPasswordToken createResetPasswordToken(User user) {
              ResetPasswordToken resetPasswordToken = new ResetPasswordToken(user);
              return resetPasswordTokenRepository.save(resetPasswordToken);
          }
      
          @Override
          public ResetPasswordToken findByResetPasswordToken(String token) {
              return resetPasswordTokenRepository.findByToken(token);
          }
      
          @Override
          public void resetPassword(String emailAddress, String password) {
              User user = findUserByEmailAddress(emailAddress);
      
              user.setPassword(passwordEncoder.encode(password));
      
          }
      
      

      ForgotPasswordEmailRequest.java

      public class ForgotPasswordEmailRequest {
          
          private String forgotPasswordEmail;
          
          private String newPassword;
      
          // constructors / getters and setters
      
      }
      
      

      我想要澄清的是,如何确切地做到这一点,并确保我可以成功地将用户重定向到重置密码页面,他们可以从那里更改它。我不确定我的控制器方法在哪里遗漏了一些东西,或者我哪里出错了。

      当用户在收到电子邮件后到达重置密码表单时,从那里需要在前端后端执行哪些过程。

      我将感谢任何帮助。

共有1个答案

逄边浩
2023-03-14

通常流程是这样的:

    < li >在前端:用户只需提供电子邮件地址,然后点击“提醒密码”
 类似资料:
  • 介绍 {tip} 想要快速上手? 只需在一个新的 Laravel 应用中运行 php artisan make:auth 命令,然后在浏览器中访问 http://your-app.dev/register 或分配给应用的任何别的 URL。这条命令将搭建起整个身份验证系统,包括重置密码! 大多数 Web 应用都为用户提供了重置密码的功能。相比强迫你在每个应用中都要重实现一遍此功能,Laravel 提

  • 我们已经讲解完了,如果创建,注册用户,激活,修改,删除用户了,看似已经全了,但是我们还缺了一点 那就是为用户提供重置密码! 这个是一个网站必不可少的功能之一吧 我们重置密码,在 sentry 中分成 两步 1、发送 重置代码给用户 2、验证 重置代码,成功则修改密码 首先我们看 第一步 获取重置密码的代码 try { // 根据 email 查找用户 $user = Sentry:

  • 本文向大家介绍MySQL重置root密码,包括了MySQL重置root密码的使用技巧和注意事项,需要的朋友参考一下 我们介绍一种无需密码的重置root密码的方式。 步骤如下: 1、打开配置文件/etc/my.cnf,在mysqld下添加一行skip-grant-tables,如下: 这样我们就可以免密登录MySQL了。 然后保存并退出。 2、重启MySQL 这两个命令2选1: 3、终端输入 mys

  • 我有一个Laravel 5.4应用程序,在我的管理区域有一个视图,允许我查看所有用户。 我想创建一个功能,允许我点击后端的一个按钮,自动发送默认的Laravel密码重置功能。 在我看来,我有以下几点: 在链接点击重置密码这当前通过我的路由点击以下功能 我不太熟悉Laravels的默认密码重置功能,因此我可能有点不熟悉,但我遇到以下错误: 传递给Illumb\Auth\Passwords\Passw

  • 本文向大家介绍Linux mysql-5.6如何实现重置root密码,包括了Linux mysql-5.6如何实现重置root密码的使用技巧和注意事项,需要的朋友参考一下 1. 检查mysql服务是否启动,如果启动,关闭mysql服务 运行命令:ps -ef | grep -i mysql 如果开着就运行关闭的命令:service mysqld stop 2.修改mysql的配置文件my.conf

  • KeyToolException:无法从存储区“C:\Keystore\Keystore.jks”中读取密钥“app name”密钥:密钥存储区被篡改,或者密码不正确 我最好的解决办法是什么?