Skip to content

Commit d1eb454

Browse files
committed
update registration methods
1 parent 308222f commit d1eb454

File tree

12 files changed

+356
-118
lines changed

12 files changed

+356
-118
lines changed

spring-security-login-and-registration/src/main/java/org/baeldung/registration/listener/RegistrationListener.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.context.ApplicationListener;
1010
import org.springframework.context.MessageSource;
11-
import org.springframework.context.annotation.PropertySource;
1211
import org.springframework.core.env.Environment;
1312
import org.springframework.mail.SimpleMailMessage;
1413
import org.springframework.mail.javamail.JavaMailSender;
1514
import org.springframework.stereotype.Component;
1615

1716
@Component
18-
@PropertySource("classpath:email.properties")
1917
public class RegistrationListener implements ApplicationListener<OnRegistrationCompleteEvent> {
2018
@Autowired
2119
private IUserService service;

spring-security-login-and-registration/src/main/java/org/baeldung/web/controller/GenericResponse.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
package org.baeldung.web.controller;
2+
3+
import java.util.Calendar;
4+
import java.util.Locale;
5+
import java.util.UUID;
6+
7+
import javax.servlet.http.HttpServletRequest;
8+
import javax.validation.Valid;
9+
10+
import org.baeldung.persistence.model.PasswordResetToken;
11+
import org.baeldung.persistence.model.User;
12+
import org.baeldung.persistence.model.VerificationToken;
13+
import org.baeldung.persistence.service.IUserService;
14+
import org.baeldung.persistence.service.UserDto;
15+
import org.baeldung.registration.OnRegistrationCompleteEvent;
16+
import org.baeldung.validation.EmailExistsException;
17+
import org.baeldung.web.error.UserNotFoundException;
18+
import org.baeldung.web.util.GenericResponse;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.context.ApplicationEventPublisher;
23+
import org.springframework.context.MessageSource;
24+
import org.springframework.core.env.Environment;
25+
import org.springframework.mail.SimpleMailMessage;
26+
import org.springframework.mail.javamail.JavaMailSender;
27+
import org.springframework.security.access.prepost.PreAuthorize;
28+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
29+
import org.springframework.security.core.Authentication;
30+
import org.springframework.security.core.context.SecurityContextHolder;
31+
import org.springframework.security.core.userdetails.UserDetailsService;
32+
import org.springframework.stereotype.Controller;
33+
import org.springframework.ui.Model;
34+
import org.springframework.validation.BindingResult;
35+
import org.springframework.validation.Errors;
36+
import org.springframework.web.bind.annotation.ModelAttribute;
37+
import org.springframework.web.bind.annotation.RequestMapping;
38+
import org.springframework.web.bind.annotation.RequestMethod;
39+
import org.springframework.web.bind.annotation.RequestParam;
40+
import org.springframework.web.bind.annotation.ResponseBody;
41+
import org.springframework.web.servlet.ModelAndView;
42+
43+
@Controller
44+
public class Registration2Controller {
45+
private final Logger LOGGER = LoggerFactory.getLogger(getClass());
46+
47+
@Autowired
48+
private IUserService userService;
49+
50+
@Autowired
51+
private MessageSource messages;
52+
53+
@Autowired
54+
private JavaMailSender mailSender;
55+
56+
@Autowired
57+
private ApplicationEventPublisher eventPublisher;
58+
59+
@Autowired
60+
private UserDetailsService userDetailsService;
61+
62+
@Autowired
63+
private Environment env;
64+
65+
public Registration2Controller() {
66+
67+
}
68+
69+
// API
70+
71+
@RequestMapping(value = "/user/registration2", method = RequestMethod.GET)
72+
public String showRegistrationForm(final HttpServletRequest request, final Model model) {
73+
LOGGER.debug("Rendering registration page.");
74+
final UserDto accountDto = new UserDto();
75+
model.addAttribute("user", accountDto);
76+
return "registration";
77+
}
78+
79+
@RequestMapping(value = "/regitrationConfirm2", method = RequestMethod.GET)
80+
public String confirmRegistration(final HttpServletRequest request, final Model model, @RequestParam("token") final String token) {
81+
final Locale locale = request.getLocale();
82+
83+
final VerificationToken verificationToken = userService.getVerificationToken(token);
84+
if (verificationToken == null) {
85+
final String message = messages.getMessage("auth.message.invalidToken", null, locale);
86+
model.addAttribute("message", message);
87+
return "redirect:/badUser.html?lang=" + locale.getLanguage();
88+
}
89+
90+
final User user = verificationToken.getUser();
91+
final Calendar cal = Calendar.getInstance();
92+
if ((verificationToken.getExpiryDate().getTime() - cal.getTime().getTime()) <= 0) {
93+
model.addAttribute("message", messages.getMessage("auth.message.expired", null, locale));
94+
model.addAttribute("expired", true);
95+
model.addAttribute("token", token);
96+
return "redirect:/badUser.html?lang=" + locale.getLanguage();
97+
}
98+
99+
user.setEnabled(true);
100+
userService.saveRegisteredUser(user);
101+
model.addAttribute("message", messages.getMessage("message.accountVerified", null, locale));
102+
return "redirect:/login.html?lang=" + locale.getLanguage();
103+
}
104+
105+
@RequestMapping(value = "/user/registration2", method = RequestMethod.POST)
106+
public ModelAndView registerUserAccount(@ModelAttribute("user") @Valid final UserDto accountDto, final BindingResult result, final HttpServletRequest request, final Errors errors) {
107+
LOGGER.debug("Registering user account with information: {}", accountDto);
108+
if (result.hasErrors()) {
109+
return new ModelAndView("registration", "user", accountDto);
110+
}
111+
112+
final User registered = createUserAccount(accountDto);
113+
if (registered == null) {
114+
result.rejectValue("email", "message.regError");
115+
return new ModelAndView("registration", "user", accountDto);
116+
}
117+
try {
118+
final String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
119+
eventPublisher.publishEvent(new OnRegistrationCompleteEvent(registered, request.getLocale(), appUrl));
120+
} catch (final Exception ex) {
121+
LOGGER.warn("Unable to register user", ex);
122+
return new ModelAndView("emailError", "user", accountDto);
123+
}
124+
return new ModelAndView("successRegister", "user", accountDto);
125+
}
126+
127+
@RequestMapping(value = "/user/resendRegistrationToken2", method = RequestMethod.GET)
128+
public @ResponseBody GenericResponse resendRegistrationToken2(final HttpServletRequest request, @RequestParam("token") final String existingToken) {
129+
final VerificationToken newToken = userService.generateNewVerificationToken(existingToken);
130+
final User user = userService.getUser(newToken.getToken());
131+
final String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
132+
final SimpleMailMessage email = constructResetVerificationTokenEmail(appUrl, request.getLocale(), newToken, user);
133+
mailSender.send(email);
134+
return new GenericResponse(messages.getMessage("message.resendToken", null, request.getLocale()));
135+
}
136+
137+
@RequestMapping(value = "/user/resetPassword2", method = RequestMethod.POST)
138+
public @ResponseBody GenericResponse resetPassword2(final HttpServletRequest request, @RequestParam("email") final String userEmail) {
139+
final User user = userService.findUserByEmail(userEmail);
140+
if (user == null) {
141+
throw new UserNotFoundException();
142+
}
143+
144+
final String token = UUID.randomUUID().toString();
145+
userService.createPasswordResetTokenForUser(user, token);
146+
final String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
147+
final SimpleMailMessage email = constructResetTokenEmail(appUrl, request.getLocale(), token, user);
148+
mailSender.send(email);
149+
150+
return new GenericResponse(messages.getMessage("message.resetPasswordEmail", null, request.getLocale()));
151+
}
152+
153+
// ==== will not be changed this is used as the confirmation url of reset password token
154+
@RequestMapping(value = "/user/changePassword2", method = RequestMethod.GET)
155+
public String changePassword(final HttpServletRequest request, final Model model, @RequestParam("id") final long id, @RequestParam("token") final String token) {
156+
final Locale locale = request.getLocale();
157+
158+
final PasswordResetToken passToken = userService.getPasswordResetToken(token);
159+
final User user = passToken.getUser();
160+
if (passToken == null || user.getId() != id) {
161+
final String message = messages.getMessage("auth.message.invalidToken", null, locale);
162+
model.addAttribute("message", message);
163+
return "redirect:/login.html?lang=" + locale.getLanguage();
164+
}
165+
166+
final Calendar cal = Calendar.getInstance();
167+
if ((passToken.getExpiryDate().getTime() - cal.getTime().getTime()) <= 0) {
168+
model.addAttribute("message", messages.getMessage("auth.message.expired", null, locale));
169+
return "redirect:/login.html?lang=" + locale.getLanguage();
170+
}
171+
172+
final Authentication auth = new UsernamePasswordAuthenticationToken(user, null, userDetailsService.loadUserByUsername(user.getEmail()).getAuthorities());
173+
SecurityContextHolder.getContext().setAuthentication(auth);
174+
175+
return "redirect:/updatePassword.html?lang=" + locale.getLanguage();
176+
}
177+
178+
@RequestMapping(value = "/user/savePassword2", method = RequestMethod.POST)
179+
@PreAuthorize("hasRole('READ_PRIVILEGE')")
180+
public @ResponseBody GenericResponse savePassword(final HttpServletRequest request, @RequestParam("password") final String password) {
181+
final User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
182+
userService.changeUserPassword(user, password);
183+
return new GenericResponse(messages.getMessage("message.resetPasswordSuc", null, request.getLocale()));
184+
}
185+
186+
// NON-API
187+
188+
private final SimpleMailMessage constructResetVerificationTokenEmail(final String contextPath, final Locale locale, final VerificationToken newToken, final User user) {
189+
final String confirmationUrl = contextPath + "/regitrationConfirm.html?token=" + newToken.getToken();
190+
final String message = messages.getMessage("message.resendToken", null, locale);
191+
final SimpleMailMessage email = new SimpleMailMessage();
192+
email.setSubject("Resend Registration Token");
193+
email.setText(message + " \r\n" + confirmationUrl);
194+
email.setTo(user.getEmail());
195+
email.setFrom(env.getProperty("support.email"));
196+
return email;
197+
}
198+
199+
private final SimpleMailMessage constructResetTokenEmail(final String contextPath, final Locale locale, final String token, final User user) {
200+
final String url = contextPath + "/user/changePassword2?id=" + user.getId() + "&token=" + token;
201+
final String message = messages.getMessage("message.resetPassword", null, locale);
202+
final SimpleMailMessage email = new SimpleMailMessage();
203+
email.setTo(user.getEmail());
204+
email.setSubject("Reset Password");
205+
email.setText(message + " \r\n" + url);
206+
email.setFrom(env.getProperty("support.email"));
207+
return email;
208+
}
209+
210+
private User createUserAccount(final UserDto accountDto) {
211+
User registered = null;
212+
try {
213+
registered = userService.registerNewUserAccount(accountDto);
214+
} catch (final EmailExistsException e) {
215+
return null;
216+
}
217+
return registered;
218+
}
219+
}

spring-security-login-and-registration/src/main/java/org/baeldung/web/controller/RegistrationController.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import org.springframework.beans.factory.annotation.Autowired;
2020
import org.springframework.context.ApplicationEventPublisher;
2121
import org.springframework.context.MessageSource;
22-
import org.springframework.context.NoSuchMessageException;
23-
import org.springframework.context.annotation.PropertySource;
2422
import org.springframework.core.env.Environment;
2523
import org.springframework.mail.MailAuthenticationException;
2624
import org.springframework.mail.SimpleMailMessage;
@@ -38,14 +36,9 @@
3836
import org.springframework.web.bind.annotation.RequestMapping;
3937
import org.springframework.web.bind.annotation.RequestMethod;
4038
import org.springframework.web.bind.annotation.RequestParam;
41-
import org.springframework.web.bind.annotation.ResponseBody;
4239
import org.springframework.web.servlet.ModelAndView;
4340

44-
import com.fasterxml.jackson.core.JsonProcessingException;
45-
import com.fasterxml.jackson.databind.ObjectMapper;
46-
4741
@Controller
48-
@PropertySource("classpath:email.properties")
4942
public class RegistrationController {
5043
private final Logger LOGGER = LoggerFactory.getLogger(getClass());
5144

@@ -150,17 +143,6 @@ public String resendRegistrationToken(final HttpServletRequest request, final Mo
150143
return "redirect:/login.html?lang=" + locale.getLanguage();
151144
}
152145

153-
@RequestMapping(value = "/user/resendRegistrationToken2", method = RequestMethod.GET)
154-
public @ResponseBody GenericResponse resendRegistrationToken2(final HttpServletRequest request, @RequestParam("token") final String existingToken) {
155-
final VerificationToken newToken = userService.generateNewVerificationToken(existingToken);
156-
final User user = userService.getUser(newToken.getToken());
157-
final String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
158-
final SimpleMailMessage email = constructResetVerificationTokenEmail(appUrl, request.getLocale(), newToken, user);
159-
mailSender.send(email);
160-
161-
return new GenericResponse(messages.getMessage("message.resendToken", null, request.getLocale()));
162-
}
163-
164146
@RequestMapping(value = "/user/resetPassword", method = RequestMethod.POST)
165147
public String resetPassword(final HttpServletRequest request, final Model model, @RequestParam("email") final String userEmail) {
166148
final User user = userService.findUserByEmail(userEmail);
@@ -187,23 +169,6 @@ public String resetPassword(final HttpServletRequest request, final Model model,
187169
return "redirect:/login.html?lang=" + request.getLocale().getLanguage();
188170
}
189171

190-
@RequestMapping(value = "/user/resetPassword2", method = RequestMethod.POST)
191-
public @ResponseBody String resetPassword2(final HttpServletRequest request, @RequestParam("email") final String userEmail) throws JsonProcessingException, NoSuchMessageException {
192-
final User user = userService.findUserByEmail(userEmail);
193-
if (user == null) {
194-
// throw new NotFoundExceptions(messages.getMessage("message.userNotFound", null, request.getLocale())); // 404
195-
return new ObjectMapper().writeValueAsString(messages.getMessage("message.userNotFound", null, request.getLocale()));
196-
}
197-
198-
final String token = UUID.randomUUID().toString();
199-
userService.createPasswordResetTokenForUser(user, token);
200-
final String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
201-
final SimpleMailMessage email = constructResetTokenEmail(appUrl, request.getLocale(), token, user);
202-
mailSender.send(email);
203-
204-
return new ObjectMapper().writeValueAsString(messages.getMessage("message.resetPasswordEmail", null, request.getLocale()));
205-
}
206-
207172
@RequestMapping(value = "/user/changePassword", method = RequestMethod.GET)
208173
public String changePassword(final HttpServletRequest request, final Model model, @RequestParam("id") final long id, @RequestParam("token") final String token) {
209174
final Locale locale = request.getLocale();
Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,50 @@
11
package org.baeldung.web.error;
22

3+
import org.baeldung.web.util.GenericResponse;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.context.MessageSource;
6+
import org.springframework.http.HttpHeaders;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
39
import org.springframework.mail.MailAuthenticationException;
410
import org.springframework.web.bind.annotation.ControllerAdvice;
511
import org.springframework.web.bind.annotation.ExceptionHandler;
6-
import org.springframework.web.bind.annotation.ResponseBody;
712
import org.springframework.web.context.request.WebRequest;
813
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
914

10-
import com.fasterxml.jackson.core.JsonProcessingException;
11-
import com.fasterxml.jackson.databind.ObjectMapper;
12-
1315
@ControllerAdvice
1416
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
1517

18+
@Autowired
19+
private MessageSource messages;
20+
1621
public RestResponseEntityExceptionHandler() {
1722
super();
1823
}
1924

2025
// API
2126

27+
// 404
28+
@ExceptionHandler({ UserNotFoundException.class })
29+
public ResponseEntity<Object> handleUserNotFound(final RuntimeException ex, final WebRequest request) {
30+
logger.error("404 Status Code", ex);
31+
final GenericResponse bodyOfResponse = new GenericResponse(messages.getMessage("message.userNotFound", null, request.getLocale()), "UserNotFound");
32+
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
33+
}
34+
2235
// 500
2336
@ExceptionHandler({ MailAuthenticationException.class })
24-
public @ResponseBody String handleMail(final RuntimeException ex, final WebRequest request) throws JsonProcessingException {
37+
public ResponseEntity<Object> handleMail(final RuntimeException ex, final WebRequest request) {
2538
logger.error("500 Status Code", ex);
26-
return new ObjectMapper().writeValueAsString("MailError");
39+
final GenericResponse bodyOfResponse = new GenericResponse(messages.getMessage("message.email.config.error", null, request.getLocale()), "MailError");
40+
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
2741
}
2842

29-
@ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class })
30-
public @ResponseBody String handleInternal(final RuntimeException ex, final WebRequest request) throws JsonProcessingException {
43+
@ExceptionHandler({ Exception.class })
44+
public ResponseEntity<Object> handleInternal(final RuntimeException ex, final WebRequest request) {
3145
logger.error("500 Status Code", ex);
32-
return new ObjectMapper().writeValueAsString("InternalError");
46+
final GenericResponse bodyOfResponse = new GenericResponse(messages.getMessage("message.error", null, request.getLocale()), "InternalError");
47+
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
3348
}
3449

3550
}

0 commit comments

Comments
 (0)