Skip to content

Commit 65d7986

Browse files
committed
Updated Code
1. Eliminated VerificationToken from DTO 2. Decoupled email sending with event publishing 3. Eliminated email param from link sent to user
1 parent 0de9836 commit 65d7986

File tree

13 files changed

+264
-162
lines changed

13 files changed

+264
-162
lines changed

spring-security-login-and-registration/.classpath

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,7 @@
2828
<attribute name="maven.pomderived" value="true"/>
2929
</attributes>
3030
</classpathentry>
31+
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
32+
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
3133
<classpathentry kind="output" path="target/classes"/>
3234
</classpath>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.baeldung.event;
2+
3+
import org.springframework.context.ApplicationEvent;
4+
5+
@SuppressWarnings("serial")
6+
public class OnRegistrationComplete extends ApplicationEvent {
7+
8+
public final Registration registration;
9+
10+
public OnRegistrationComplete(Registration source) {
11+
super(source);
12+
this.registration=source;
13+
}
14+
15+
public Registration getRegistration() {
16+
return registration;
17+
}
18+
19+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.baeldung.event;
2+
3+
import java.util.Locale;
4+
import org.baeldung.persistence.model.User;
5+
import org.springframework.context.ApplicationEventPublisher;
6+
import org.springframework.context.ApplicationEventPublisherAware;
7+
import org.springframework.stereotype.Component;
8+
9+
@Component
10+
public class Registration implements ApplicationEventPublisherAware {
11+
12+
private ApplicationEventPublisher eventPublisher;
13+
14+
public String getAppUrl() {
15+
return appUrl;
16+
}
17+
18+
public Locale getLocale() {
19+
return locale;
20+
}
21+
22+
public void setAppUrl(String appUrl) {
23+
this.appUrl = appUrl;
24+
}
25+
26+
public void setLocale(Locale locale) {
27+
this.locale = locale;
28+
}
29+
30+
public void setUser(User user) {
31+
this.user = user;
32+
}
33+
34+
public User getUser() {
35+
return user;
36+
}
37+
38+
private String appUrl;
39+
private Locale locale;
40+
private User user;
41+
42+
public Registration() {
43+
super();
44+
}
45+
46+
public void deliver() {
47+
this.eventPublisher.publishEvent(new OnRegistrationComplete(this));
48+
}
49+
50+
@Override
51+
public void setApplicationEventPublisher(
52+
ApplicationEventPublisher applicationEventPublisher) {
53+
this.eventPublisher = applicationEventPublisher;
54+
55+
}
56+
57+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.baeldung.event.service;
2+
3+
4+
import java.util.UUID;
5+
import org.baeldung.event.OnRegistrationComplete;
6+
import org.baeldung.persistence.model.User;
7+
import org.baeldung.persistence.service.IUserService;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.context.ApplicationListener;
10+
import org.springframework.context.MessageSource;
11+
import org.springframework.mail.SimpleMailMessage;
12+
import org.springframework.mail.javamail.JavaMailSender;
13+
import org.springframework.stereotype.Service;
14+
15+
@Service
16+
public class RegistrationService implements
17+
ApplicationListener<OnRegistrationComplete> {
18+
@Autowired
19+
private IUserService service;
20+
@Autowired
21+
private MessageSource messages;
22+
23+
@Autowired
24+
private JavaMailSender mailSender;
25+
26+
@Override
27+
public void onApplicationEvent(OnRegistrationComplete event) {
28+
this.confirmRegistration(event);
29+
}
30+
31+
private void confirmRegistration(OnRegistrationComplete event) {
32+
User user = event.getRegistration().getUser();
33+
String token = UUID.randomUUID().toString();
34+
service.addVerificationToken(user, token);
35+
String recipientAddress = user.getEmail();
36+
String subject = "Registration Confirmation";
37+
String confirmationUrl = event.getRegistration().getAppUrl()
38+
+ "/regitrationConfirm.html?token=" + token;
39+
String message = messages.getMessage("message.regSucc", null, event
40+
.getRegistration().getLocale());
41+
SimpleMailMessage email = new SimpleMailMessage();
42+
email.setTo(recipientAddress);
43+
email.setSubject(subject);
44+
email.setText(message + " \r\n" + "http://localhost:8080"
45+
+ confirmationUrl);
46+
mailSender.send(email);
47+
48+
}
49+
50+
}

spring-security-login-and-registration/src/main/java/org/baeldung/persistence/dao/UserRepository.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
import org.springframework.data.jpa.repository.JpaRepository;
44
import org.baeldung.persistence.model.User;
5-
import org.baeldung.persistence.model.VerificationToken;
65

76
public interface UserRepository extends JpaRepository<User, Long> {
8-
public User findByEmail(String email);
9-
//NOV 5th
10-
// public User findByVerificationToken(VerificationToken token);
11-
//OCT 21
12-
public void delete(User user);
7+
public User findByEmail(String email);
8+
9+
public void delete(User user);
1310
}

spring-security-login-and-registration/src/main/java/org/baeldung/persistence/model/User.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,19 @@
1313
@Entity
1414
@Table
1515
public class User {
16-
17-
@Id
18-
@GeneratedValue(strategy = GenerationType.AUTO)
19-
private Long id;
20-
@Column(name="firstName")
21-
private String firstName;
16+
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.AUTO)
19+
private Long id;
20+
@Column(name = "firstName")
21+
private String firstName;
2222
@Column(name="lastName")
2323
private String lastName;
2424
@Column(name="email")
2525
private String email;
2626
@Column(name="password")
2727
private String password;
2828

29-
//EMAIL CONF ARTICLE
3029
@OneToOne(mappedBy="user",
3130
fetch = FetchType.EAGER,
3231
cascade= CascadeType.ALL)

spring-security-login-and-registration/src/main/java/org/baeldung/persistence/model/VerificationToken.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.baeldung.persistence.model;
22

33
import java.util.Calendar;
4-
import java.io.Serializable;
54
import java.sql.Date;
65
import java.sql.Timestamp;
76
import javax.persistence.Column;
@@ -14,13 +13,11 @@
1413
import javax.persistence.OneToOne;
1514
import javax.persistence.Table;
1615

17-
@Entity(/*name = "verrification_token"*/)
18-
@Table(/*name = "verrification_token"*/)
19-
public class VerificationToken /*implements Serializable*/ {
16+
@Entity()
17+
@Table()
18+
public class VerificationToken {
2019

21-
//private static final long serialVersionUID = 1L;
22-
23-
private static final int EXPIRATION = 60 * 24/* 1 */;
20+
private static final int EXPIRATION = 60 * 24;
2421

2522
@Id
2623
@GeneratedValue(strategy = GenerationType.AUTO)
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package org.baeldung.persistence.service;
22

33
import org.baeldung.persistence.model.User;
4-
import org.baeldung.persistence.model.VerificationToken;
54
import org.baeldung.validation.service.EmailExistsException;
65

76
public interface IUserService {
87

98
public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException;
109

11-
//OCT 21 EMAIL VERIFICATION
1210
public User getRegisteredUser(String email);
1311

12+
public User getUser(String verificationToken);
13+
1414
public void verifyRegisteredUser(User user);
15+
16+
public void addVerificationToken(User user, String token);
1517
}

spring-security-login-and-registration/src/main/java/org/baeldung/persistence/service/UserDto.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,7 @@ public class UserDto {
2424
@NotNull
2525
@NotEmpty
2626
private String email;
27-
private String token;
28-
29-
public String getToken() {
30-
return token;
31-
}
32-
33-
public void setToken(String token) {
34-
this.token = token;
35-
}
36-
27+
3728
public String getEmail() {
3829
return email;
3930
}

spring-security-login-and-registration/src/main/java/org/baeldung/persistence/service/UserService.java

Lines changed: 60 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import javax.transaction.Transactional;
44

55
import org.baeldung.persistence.dao.UserRepository;
6+
import org.baeldung.persistence.dao.VerificationTokenRepository;
67
import org.baeldung.persistence.model.Role;
78
import org.baeldung.persistence.model.User;
89
import org.baeldung.persistence.model.VerificationToken;
@@ -12,49 +13,63 @@
1213

1314
@Service
1415
public class UserService implements IUserService {
15-
@Autowired
16-
private UserRepository repository;
17-
18-
@Transactional
19-
@Override
20-
public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException {
21-
if (emailExist(accountDto.getEmail())) {
22-
throw new EmailExistsException("There is an account with that email adress: " + accountDto.getEmail());
23-
}
24-
User user = new User();
25-
user.setFirstName(accountDto.getFirstName());
26-
user.setLastName(accountDto.getLastName());
27-
user.setPassword(accountDto.getPassword());
28-
user.setEmail(accountDto.getEmail());
29-
// ROLE WILL ALWAYS BE USER. HARDCODING IT
30-
user.setRole(new Role(Integer.valueOf(1), user));
31-
//OCT 21 EMAIL VERIFICATION VERSION
32-
//MIGHT CHANGE HERE
33-
VerificationToken myToken = new VerificationToken(accountDto.getToken(),user);
34-
user.setVerificationToken(myToken);
35-
return repository.save(user);
36-
}
37-
38-
private boolean emailExist(String email) {
39-
User user = repository.findByEmail(email);
40-
if (user != null) {
41-
return true;
42-
}
43-
return false;
44-
}
45-
46-
//OCT 21 EMAIL VERIFICATION
47-
@Override
48-
public User getRegisteredUser(String email){
49-
50-
User user = repository.findByEmail(email);
51-
return user;
52-
53-
}
54-
55-
@Transactional
56-
@Override
57-
public void verifyRegisteredUser(User user){
58-
repository.save(user);
59-
}
16+
@Autowired
17+
private UserRepository repository;
18+
// NOV 6
19+
@Autowired
20+
private VerificationTokenRepository tokenRepository;
21+
22+
@Transactional
23+
@Override
24+
public User registerNewUserAccount(UserDto accountDto)
25+
throws EmailExistsException {
26+
if (emailExist(accountDto.getEmail())) {
27+
throw new EmailExistsException(
28+
"There is an account with that email adress: "
29+
+ accountDto.getEmail());
30+
}
31+
User user = new User();
32+
user.setFirstName(accountDto.getFirstName());
33+
user.setLastName(accountDto.getLastName());
34+
user.setPassword(accountDto.getPassword());
35+
user.setEmail(accountDto.getEmail());
36+
user.setRole(new Role(Integer.valueOf(1), user));
37+
return repository.save(user);
38+
}
39+
40+
private boolean emailExist(String email) {
41+
User user = repository.findByEmail(email);
42+
if (user != null) {
43+
return true;
44+
}
45+
return false;
46+
}
47+
48+
@Override
49+
public User getRegisteredUser(String email) {
50+
51+
User user = repository.findByEmail(email);
52+
return user;
53+
54+
}
55+
56+
@Override
57+
public User getUser(String verificationToken) {
58+
User user = tokenRepository.findByToken(verificationToken).getUser();
59+
return user;
60+
}
61+
62+
@Transactional
63+
@Override
64+
public void verifyRegisteredUser(User user) {
65+
repository.save(user);
66+
}
67+
68+
@Transactional
69+
@Override
70+
public void addVerificationToken(User user, String token) {
71+
VerificationToken myToken = new VerificationToken(token, user);
72+
user.setVerificationToken(myToken);
73+
repository.save(user);
74+
}
6075
}

0 commit comments

Comments
 (0)