spring-security 一个更好的方法来自动登录用户后,帐户验证在Spring Boot ?

i2loujxw  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(138)

我正在做一个用春 Boot 和百里香叶做的练习项目。
我有一个注册表。当用户注册了他们的帐户后,一个验证码会被发送到他们的邮箱。下一页是他们输入验证码的地方。
我使用RedirectAttributes来存储验证码ID,以便能够在验证码页面中查找/确认验证码。我还使用RedirectAttributes将用户电子邮件和原始密码传递到验证码页面,以便他们在确认帐户后可以自动登录。

@PostMapping("/register")
public String processRegisterForm(@ModelAttribute NewAccountRequest newAccountRequest, RedirectAttributes redirectAttributes) {
    Long verifyCodeId = accountService.createAccount(newAccountRequest);
    redirectAttributes.addFlashAttribute("verifyCodeId", verifyCodeId);
    redirectAttributes.addFlashAttribute("userEmail", newAccountRequest.getEmail());
    redirectAttributes.addFlashAttribute("rawPassword", newAccountRequest.getPassword());
    return "redirect:/register/verify-account"; 
}

现在,这里是混乱的地方。在GetMapping页面输入验证码,我还必须添加完全相同的属性,我在上面的PostMapping添加。像这样:

@GetMapping("/register/verify-account")
public String loadVerificationPage(@ModelAttribute("verifyCodeId") String verifyCodeId, @ModelAttribute("userEmail") String userEmail, @ModelAttribute("rawPassword") String rawPassword, Model model) {
    model.addAttribute("verifyCodeId", verifyCodeId);
    model.addAttribute("userEmail", userEmail);
    model.addAttribute("rawPassword", rawPassword);
    return "verify-account";
}

在百里香叶里,我这样做:

<input type="hidden" name="verificationCodeId" th:value="${verifyCodeId}">
<input type="hidden" name="userEmail", th:value="${userEmail}">
<input type="hidden" name="rawPassword" th:value="${rawPassword}">

并在PostMapping页面输入验证码:

@PostMapping("/register/verify-account")
public String confirmVerifyCode(@RequestParam String enteredVerificationCode, @RequestParam String verificationCodeId, @RequestParam String userEmail, @RequestParam String rawPassword,
                                HttpServletRequest request) {
    accountService.confirmVerificationCode(enteredVerificationCode, verificationCodeId);
    try {
        request.login(userEmail, rawPassword);
    }
    catch (ServletException e) {
        System.out.println("Login error: " + e);
    }
    return "redirect:/?loginSuccess";
}

我无法直接在register/verify-account的PostMapping中获取flash属性,因此我需要使用thymeleaf中的输入字段

我觉得有一个更简单的方法来完成这个任务,因为这看起来真的很混乱。有什么提示吗?还请注意,我没有添加任何验证,所以忽略它。使用flash属性保存验证码和密码会有什么安全风险吗?或者在“隐藏”输入字段中存储验证码会有什么安全风险吗?

注册流程:
1.用户加载注册页面
1.提交表单时,将调用processRegisterForm();
1.创建用户帐户并返回验证码ID。
1.为了在下一页确认验证码,id被存储在flash属性中。用户的电子邮件和原始密码也被存储。用户被重定向到页面以输入验证码
1.对于页面的GetMapping输入验证码,增加了model属性来存放验证码id、用户email和密码,在thymeleaf中,隐藏的输入字段用来存放上面提到的这3个值。
1.输入验证码页面的PostMapping获取这3个字段,并使用它来验证/自动登录用户。
我希望有一个更好的方法来实现这一点。对不起长后。任何帮助将不胜感激,谢谢

zpqajqem

zpqajqem1#

最后我用一个DTO代替了那些请求参数来清理代码。不知道为什么我没有早点这么做。
在/register/verify-accountMap中,在登录用户之前,我执行了以下操作:

if (passwordEncoder.matches(userPassword, dbPassword)) {
        try {
            request.login(account.getEmail(), userPassword);
        }
        catch (ServletException e) {
            System.out.println("Login after account verification failed" + e);
        }
    }
else {
        System.out.println("fishy fishy");
}

我不确定这是否真的增加了安全性,但目前对我来说已经足够了。特别感谢这些人对我的帮助:、和
编辑:我最终使用了HttpSession

相关问题