Skip to content

Commit 4c04796

Browse files
committed
feat(app): add flash message, solve security errors.
1 parent 4752af2 commit 4c04796

File tree

8 files changed

+73
-16
lines changed

8 files changed

+73
-16
lines changed

src/main/java/controllers/admin/PostController.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
package controllers.admin;
77

88
import exceptions.PostNotFoundException;
9+
import java.util.ArrayList;
910
import java.util.List;
11+
import java.util.Locale;
1012
import javax.validation.Valid;
1113
import models.Post;
1214
import models.User;
1315
import org.slf4j.Logger;
1416
import org.slf4j.LoggerFactory;
1517
import org.springframework.beans.factory.annotation.Autowired;
18+
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
1619
import org.springframework.stereotype.Controller;
1720
import org.springframework.ui.Model;
1821
import org.springframework.validation.Errors;
@@ -21,6 +24,7 @@
2124
import org.springframework.web.bind.annotation.PathVariable;
2225
import org.springframework.web.bind.annotation.PostMapping;
2326
import org.springframework.web.bind.annotation.RequestMapping;
27+
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
2428
import services.PostService;
2529
import services.security.CurrentUser;
2630
import services.security.CurrentUserAttached;
@@ -38,6 +42,8 @@ public class PostController {
3842

3943
@Autowired
4044
private PostService postService;
45+
@Autowired
46+
private ReloadableResourceBundleMessageSource messageSource;
4147

4248
@GetMapping("/all")
4349
public String all(@CurrentUser User activeUser, Model model){
@@ -68,8 +74,11 @@ public String showDeletePostForm(@PathVariable Long postId, Model model) {
6874
}
6975

7076
@PostMapping("/delete")
71-
public String processDelete(@ModelAttribute Post post, Model model) {
77+
public String processDelete(@ModelAttribute Post post, RedirectAttributes model) {
7278
postService.delete(post);
79+
List<String> successMessages = new ArrayList();
80+
successMessages.add(messageSource.getMessage("message.post.remove.success", new Object[] {}, Locale.getDefault()));
81+
model.addFlashAttribute("successFlashMessages", successMessages);
7382
return "redirect:/admin/posts/all";
7483
}
7584

@@ -80,12 +89,16 @@ public String showCreatePostForm(Model model){
8089
}
8190

8291
@PostMapping("/save")
83-
public String processPost(@ModelAttribute @Valid Post post, Errors errors, @CurrentUserAttached User activeUser){
92+
public String processPost(@ModelAttribute @Valid Post post, Errors errors,
93+
@CurrentUserAttached User activeUser, RedirectAttributes model){
8494
if(errors.hasErrors()){
8595
return "admin/post/create";
8696
}
8797
post.setAuthor(activeUser);
8898
postService.create(post);
99+
List<String> successMessages = new ArrayList();
100+
successMessages.add(messageSource.getMessage("message.post.save.success", new Object[] {post.getId()}, Locale.getDefault()));
101+
model.addFlashAttribute("successFlashMessages", successMessages);
89102
return "redirect:/admin/posts/all";
90103
}
91104
}

src/main/java/controllers/admin/SignupController.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
package controllers.admin;
77

88
import exceptions.UserAlredyExistsException;
9+
import java.util.Locale;
910
import javax.validation.Valid;
1011
import models.Role;
1112
import models.User;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
1517
import org.springframework.stereotype.Controller;
1618
import org.springframework.ui.Model;
1719
import org.springframework.validation.Errors;
@@ -22,7 +24,8 @@
2224
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
2325
import repositories.RolesRepository;
2426
import services.UserService;
25-
27+
import java.util.List;
28+
import java.util.ArrayList;
2629
/**
2730
*
2831
* @author sergio
@@ -37,6 +40,8 @@ public class SignupController {
3740
private UserService userService;
3841
@Autowired
3942
private RolesRepository rolesRepository;
43+
@Autowired
44+
private ReloadableResourceBundleMessageSource messageSource;
4045

4146
@GetMapping("/signup")
4247
public String showSignupForm(Model model){
@@ -52,8 +57,10 @@ public String processSignup(@ModelAttribute @Valid User user, Errors errors, Red
5257
Role role = rolesRepository.findByName("ROLE_BLOG_CONTRIBUTOR");
5358
user.addRole(role);
5459
userService.registerNewUserAccount(user);
55-
model.addFlashAttribute("message", user);
56-
viewName = "redirect:/admin";
60+
List<String> successMessages = new ArrayList();
61+
successMessages.add(messageSource.getMessage("message.signup.success", new Object[]{ user.getUsername() }, Locale.getDefault()));
62+
model.addFlashAttribute("successFlashMessages", successMessages);
63+
viewName = "redirect:/admin/login";
5764
}catch(UserAlredyExistsException e){
5865
logger.error("Email alredy exists");
5966
errors.rejectValue("email", "user.exists");

src/main/java/models/Role.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,22 @@
88
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
99
import com.fasterxml.jackson.annotation.ObjectIdGenerators.IntSequenceGenerator;
1010
import java.io.Serializable;
11+
import java.util.HashSet;
12+
import java.util.Set;
1113
import javax.persistence.Column;
1214
import javax.persistence.Entity;
15+
import javax.persistence.FetchType;
1316
import javax.persistence.GeneratedValue;
1417
import javax.persistence.GenerationType;
1518
import javax.persistence.Id;
19+
import javax.persistence.ManyToMany;
1620
import javax.persistence.Table;
21+
import org.springframework.security.core.GrantedAuthority;
1722

1823
@Entity
1924
@Table(name = "roles")
2025
@JsonIdentityInfo(generator=IntSequenceGenerator.class, property="@id")
21-
public class Role implements Serializable {
26+
public class Role implements Serializable, GrantedAuthority {
2227

2328
@Id
2429
@GeneratedValue(strategy = GenerationType.AUTO)
@@ -27,6 +32,9 @@ public class Role implements Serializable {
2732
@Column(nullable = false, unique = true)
2833
private String name;
2934

35+
@ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER)
36+
private Set<User> users = new HashSet();
37+
3038
private String description;
3139

3240
public Role(){}
@@ -64,6 +72,23 @@ public void setDescription(String description) {
6472
this.description = description;
6573
}
6674

75+
public Set<User> getUsers() {
76+
return users;
77+
}
78+
79+
public void setUsers(Set<User> users) {
80+
this.users = users;
81+
}
82+
83+
public void addUser(User user){
84+
users.add(user);
85+
}
86+
87+
@Override
88+
public String getAuthority() {
89+
return name;
90+
}
91+
6792
@Override
6893
public String toString() {
6994
return "Role{" + "id=" + id + ", name=" + name + ", description=" + description + '}';

src/main/java/models/User.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222
import org.hibernate.validator.constraints.Email;
2323
import org.hibernate.validator.constraints.NotBlank;
2424
import org.springframework.security.core.GrantedAuthority;
25-
import org.springframework.security.core.authority.AuthorityUtils;
2625
import org.springframework.security.core.userdetails.UserDetails;
27-
import org.springframework.util.StringUtils;
2826

2927
@Entity
3028
@Table(name = "users")
@@ -65,7 +63,7 @@ public class User implements Serializable, UserDetails {
6563
private String fullName;
6664

6765
@OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
68-
private Set<Post> posts = new HashSet<Post>();
66+
private Set<Post> posts = new HashSet();
6967

7068
@Column(nullable = true)
7169
private Date lastLoginAccess;
@@ -76,7 +74,7 @@ public class User implements Serializable, UserDetails {
7674
name="USER_ROLES",
7775
joinColumns=@JoinColumn(name="USER_ID", referencedColumnName="ID"),
7876
inverseJoinColumns=@JoinColumn(name="ROLE_ID", referencedColumnName="ID"))
79-
private Set<Role> roles;
77+
private Set<Role> roles = new HashSet();
8078

8179
public User() {}
8280

@@ -184,12 +182,12 @@ public void setRoles(Set<Role> roles) {
184182

185183
public void addRole(Role role){
186184
this.roles.add(role);
185+
role.addUser(this);
187186
}
188187

189188
@Override
190189
public Collection<? extends GrantedAuthority> getAuthorities() {
191-
String userRoles = StringUtils.collectionToCommaDelimitedString(roles);
192-
return AuthorityUtils.commaSeparatedStringToAuthorityList(userRoles);
190+
return roles;
193191
}
194192

195193
@Override

src/main/java/services/security/CustomUserDetailsService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
package services.security;
77

88
import java.io.Serializable;
9-
import java.util.List;
109
import models.User;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1112
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.springframework.security.core.userdetails.UserDetails;
1314
import org.springframework.security.core.userdetails.UserDetailsService;
1415
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1516
import org.springframework.stereotype.Service;
1617
import repositories.UserRepository;
17-
import repositories.RolesRepository;
1818

1919
/**
2020
*
@@ -24,6 +24,7 @@
2424
public class CustomUserDetailsService implements UserDetailsService, Serializable {
2525

2626
private final UserRepository userRepository;
27+
private static Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);
2728

2829
@Autowired
2930
public CustomUserDetailsService(UserRepository userRepository) {
@@ -36,6 +37,7 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx
3637
if (null == user) {
3738
throw new UsernameNotFoundException("No user present with username: " + username);
3839
}
40+
logger.info("Usuario obtenido: " + user.toString());
3941
return user;
4042
}
4143
}

src/main/webapp/WEB-INF/i18n/messages.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ post.delete.title = \u00bfDeseas eliminar este art\u00edculo?
6969
#### Error Page ####
7070
error.back.home = Regresar a la p\u00e1gina de inicio
7171
#### Flash Messages ####
72-
message.signup.success = Bienvenido {user}! Tu cuenta ha sido creada con \u00e9xito.
72+
message.signup.success = Bienvenido {0}! Tu cuenta ha sido creada con \u00e9xito inicia sesi\u00f3n para continuar.
73+
message.post.save.success = La informaci\u00f3n del post {0}, ha sido guardada con \u00e9xito.
74+
message.post.remove.success = El art\u00edculo ha sido eliminado con \u00e9xito.
7375
user.exists = Ya existe un usuario con este correo electr\u00f3nico o nombre de usuario.
7476
app.dateformat=dd-MMM-yyyy

src/main/webapp/WEB-INF/templates/admin/login.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ <h6 th:text="#{login.sign.in}">Sign In</h6>
1717
<div th:if="${param.logout}" th:text="#{login.logged.out}" class="alert alert-success">
1818
You have been logged out.
1919
</div>
20+
<div th:if="${not #lists.isEmpty(successFlashMessages)}" class="alert alert-success">
21+
<ul>
22+
<li th:each="message:${successFlashMessages}" th:text="${message}"></li>
23+
</ul>
24+
</div>
2025
<div class="social">
2126
<a class="face_login" href="#">
2227
<span class="face_icon">

src/main/webapp/WEB-INF/templates/admin/post/all.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@
1313
<div class="panel-title" th:text="#{posts.all.title}">Posts</div>
1414
</div>
1515
<div class="panel-body">
16-
<a href="#" th:href="@{/admin/posts/create}" th:text="#{posts.all.create}" class="btn btn-primary btn-lg text-uppercase">Create new Post</a>
16+
<div th:if="${not #lists.isEmpty(successFlashMessages)}" class="alert alert-success">
17+
<ul>
18+
<li th:each="message:${successFlashMessages}" th:text="${message}"></li>
19+
</ul>
20+
</div>
21+
<a href="#" th:href="@{/admin/posts/create}" th:text="#{posts.all.create}" class="btn btn-primary text-uppercase">Create new Post</a>
1722
<br />
1823
<table id="posts" cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered">
1924
<thead>

0 commit comments

Comments
 (0)