From eed646c64e5547a0632a5363ae850f4a81a9475b Mon Sep 17 00:00:00 2001
From: Thomas <gltron3000@gmail.com>
Date: Sun, 17 May 2020 12:49:52 +0200
Subject: [PATCH] Added user roles

---
 .../mozen/auth/JwtAuthenticationFilter.java   |  5 +++++
 .../mozen/auth/JwtUserDetailsService.java     | 20 +++++++++++++++++--
 .../main/java/mozen/business/UserManager.java |  3 ++-
 mozen/src/main/java/mozen/model/Role.java     |  5 +++++
 mozen/src/main/java/mozen/model/User.java     | 11 ++++++----
 .../main/java/mozen/utils/DatabaseFiller.java |  5 +++--
 6 files changed, 40 insertions(+), 9 deletions(-)
 create mode 100644 mozen/src/main/java/mozen/model/Role.java

diff --git a/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java b/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
index 1a46cd4..6feaf4b 100644
--- a/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
+++ b/mozen/src/main/java/mozen/auth/JwtAuthenticationFilter.java
@@ -18,6 +18,7 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
@@ -53,10 +54,14 @@ public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilte
   throws IOException, ServletException {
     User user = (User) auth.getPrincipal();
     Key key = KeyGenerator.generateKey();
+
+    // ! A modifier si gestion multi roles (cf UserDetailsService)
+    SimpleGrantedAuthority authority = (SimpleGrantedAuthority) user.getAuthorities().toArray()[0];
     
     String token = Jwts.builder()
       .setSubject(user.getUsername())
       .claim("username",user.getUsername())
+      .claim("role",authority.getAuthority())
       .setIssuedAt(new Date())
       .setExpiration(toDate(LocalDateTime.now().plusDays(1L)))
       .signWith(SignatureAlgorithm.HS512, key)
diff --git a/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java b/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java
index a6bc4da..56e3b53 100644
--- a/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java
+++ b/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java
@@ -1,8 +1,11 @@
 package mozen.auth;
 
-import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -20,7 +23,20 @@ public class JwtUserDetailsService implements UserDetailsService {
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
     mozen.model.User user = manager.getUserByUsername(username);
     if(user == null) throw new UsernameNotFoundException(username);
-    return new User(user.getUsername(), user.getPassword(), new ArrayList<>());
+    
+    Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
+    
+    /* 
+    // Gestion multi roles
+    // Plus propre (Transformer model.Role en Entity et model.User.role en liste de Role)
+    for(Role role : user.getRoles()){
+      grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
+    }
+    */
+
+    grantedAuthorities.add(new SimpleGrantedAuthority(user.getRole().toString()));
+
+    return new User(user.getUsername(), user.getPassword(), grantedAuthorities);
   }
   
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/UserManager.java b/mozen/src/main/java/mozen/business/UserManager.java
index 266da3d..fe5a497 100644
--- a/mozen/src/main/java/mozen/business/UserManager.java
+++ b/mozen/src/main/java/mozen/business/UserManager.java
@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
+import mozen.model.Role;
 import mozen.model.SignupMessage;
 import mozen.model.User;
 
@@ -22,7 +23,7 @@ public class UserManager implements IUserManager {
     u.setEmail(message.getEmail());
     u.setUsername(message.getUsername());
     u.setPassword(bCryptPasswordEncoder.encode(message.getPassword()));
-    u.setRole("DEFAULT");
+    u.setRole(Role.Default);
 
     dao.addUser(u);
     return u.getId();
diff --git a/mozen/src/main/java/mozen/model/Role.java b/mozen/src/main/java/mozen/model/Role.java
new file mode 100644
index 0000000..1db11ea
--- /dev/null
+++ b/mozen/src/main/java/mozen/model/Role.java
@@ -0,0 +1,5 @@
+package mozen.model;
+
+public enum Role {
+  Default, Admin
+}
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/model/User.java b/mozen/src/main/java/mozen/model/User.java
index b8db2c7..14330d2 100644
--- a/mozen/src/main/java/mozen/model/User.java
+++ b/mozen/src/main/java/mozen/model/User.java
@@ -7,6 +7,8 @@ import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
@@ -52,7 +54,8 @@ public class User implements Serializable{
   @Basic
   @Column(nullable = false)
   @NotNull
-  private String role;
+  @Enumerated(EnumType.STRING)
+  private Role role;
   
   @Basic
   @OneToMany(mappedBy = "author", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@@ -62,7 +65,7 @@ public class User implements Serializable{
   public User() {
   }
 
-  public User(Long id, String username, String email, String password, String role, Set<Model> models) {
+  public User(Long id, String username, String email, String password, Role role, Set<Model> models) {
     this.id = id;
     this.username = username;
     this.email = email;
@@ -114,11 +117,11 @@ public class User implements Serializable{
   }
 
   @JsonIgnore
-  public String getRole() {
+  public Role getRole() {
     return this.role;
   }
 
-  public void setRole(String role) {
+  public void setRole(Role role) {
     this.role = role;
   }
 
diff --git a/mozen/src/main/java/mozen/utils/DatabaseFiller.java b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
index 6754eac..5d54c98 100644
--- a/mozen/src/main/java/mozen/utils/DatabaseFiller.java
+++ b/mozen/src/main/java/mozen/utils/DatabaseFiller.java
@@ -13,6 +13,7 @@ import mozen.business.IModelDao;
 import mozen.business.IUserDao;
 import mozen.model.CustomLayer;
 import mozen.model.Model;
+import mozen.model.Role;
 import mozen.model.Tag;
 import mozen.model.TagCategory;
 import mozen.model.User;
@@ -37,13 +38,13 @@ public class DatabaseFiller {
     u1.setEmail("user1@email.com");
     u1.setPassword("1234");
     u1.setUsername("user 1");
-    u1.setRole("DEFAULT");
+    u1.setRole(Role.Default);
 
     User u2 = new User();
     u2.setEmail("user2@email.com");
     u2.setPassword("1234");
     u2.setUsername("user 2");
-    u2.setRole("ADMIN");
+    u2.setRole(Role.Admin);
 
     Model m1 = new Model();
     m1.setAuthor(u1);
-- 
GitLab