PasswordResetController.java
package com.ctrlbuy.webshop.controller;
import com.ctrlbuy.webshop.service.UserService;
import com.ctrlbuy.webshop.service.EmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
public class PasswordResetController {
private static final Logger logger = LoggerFactory.getLogger(PasswordResetController.class);
@Autowired
private UserService userService;
@Autowired
private EmailService emailService;
@GetMapping("/forgot-password")
public String showForgotPasswordForm() {
return "forgot-password";
}
@PostMapping("/forgot-password")
public String processForgotPassword(@RequestParam("email") String email,
@RequestParam("username") String username,
Model model,
RedirectAttributes redirectAttributes) {
try {
logger.info("đ BegĂ€ran om lösenordsĂ„terstĂ€llning för anvĂ€ndarnamn: {} och email: {}", username, email);
// KrĂ€v BĂ
DE username OCH email för sÀkerhet
String resetToken = userService.generateResetTokenWithUsernameAndEmail(
username.trim(),
email.trim().toLowerCase()
);
if (resetToken != null) {
// Skicka email via EmailService
boolean emailSent = emailService.sendPasswordResetEmail(email.trim().toLowerCase(), resetToken);
if (emailSent) {
logger.info("â
Reset-mail skickat till: {} för anvÀndare: {}", email, username);
model.addAttribute("success",
"En ÄterstÀllningslÀnk har skickats till din registrerade e-postadress.");
} else {
logger.warn("â ïž Kunde inte skicka reset-mail till: {} för anvĂ€ndare: {}", email, username);
model.addAttribute("error", "Ett tekniskt fel uppstod. Försök igen senare.");
}
} else {
logger.warn("â ïž Ingen matchning för anvĂ€ndarnamn: {} och email: {}", username, email);
model.addAttribute("error",
"Ingen anvÀndare hittades med denna kombination av anvÀndarnamn och e-postadress.");
}
} catch (Exception e) {
logger.error("â Fel vid lösenordsĂ„terstĂ€llning för {} / {}: {}", username, email, e.getMessage());
model.addAttribute("error", "Ett fel uppstod. Kontrollera dina uppgifter och försök igen.");
}
return "forgot-password";
}
@GetMapping("/reset-password")
public String showResetPasswordForm(@RequestParam("token") String token, Model model) {
if (!userService.isValidResetToken(token)) {
model.addAttribute("error", "Ogiltigt eller utgÄnget ÄterstÀllningstoken.");
return "reset-password-error";
}
model.addAttribute("token", token);
return "reset-password";
}
@PostMapping("/reset-password")
public String processResetPassword(@RequestParam("token") String token,
@RequestParam("password") String password,
@RequestParam("confirmPassword") String confirmPassword,
Model model,
RedirectAttributes redirectAttributes) {
if (!userService.isValidResetToken(token)) {
model.addAttribute("error", "Ogiltigt token.");
return "reset-password-error";
}
if (password.length() < 6) {
model.addAttribute("error", "Lösenordet mÄste vara minst 6 tecken lÄngt.");
model.addAttribute("token", token);
return "reset-password";
}
if (!password.equals(confirmPassword)) {
model.addAttribute("error", "Lösenorden matchar inte.");
model.addAttribute("token", token);
return "reset-password";
}
boolean success = userService.resetPassword(token, password);
if (success) {
logger.info("â
Lösenord ÄterstÀllt framgÄngsrikt för token: {}", token.substring(0, 8) + "...");
redirectAttributes.addFlashAttribute("success", "Lösenord ÄterstÀllt framgÄngsrikt! Du kan nu logga in.");
return "redirect:/user/login";
} else {
logger.error("â Kunde inte Ă„terstĂ€lla lösenordet för token: {}", token.substring(0, 8) + "...");
model.addAttribute("error", "Kunde inte ÄterstÀlla lösenordet. Tokenets giltighetstid kan ha gÄtt ut.");
return "reset-password-error";
}
}
}