Browse Source

Implement admin pages

tripeur 4 years ago
parent
commit
3df6984213
47 changed files with 279 additions and 78 deletions
  1. 7 7
      src/main/java/fr/jaquin/bdlg/planner/controller/ApiController.java
  2. 7 1
      src/main/java/fr/jaquin/bdlg/planner/controller/PageController.java
  3. 49 22
      src/main/java/fr/jaquin/bdlg/planner/controller/UserController.java
  4. 0 7
      src/main/java/fr/jaquin/bdlg/planner/persistence/CustomUserRepository.java
  5. 3 3
      src/main/java/fr/jaquin/bdlg/planner/persistence/Evenement.java
  6. 43 6
      src/main/java/fr/jaquin/bdlg/planner/persistence/MyUser.java
  7. 30 0
      src/main/java/fr/jaquin/bdlg/planner/persistence/Role.java
  8. 2 1
      src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/EvenementLobRepository.java
  9. 2 1
      src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/EvenementRepository.java
  10. 8 0
      src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/MyUserRepository.java
  11. 10 0
      src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/RoleRepository.java
  12. 6 9
      src/main/java/fr/jaquin/bdlg/planner/security/CustomUserDetailService.java
  13. 31 10
      src/main/java/fr/jaquin/bdlg/planner/security/LoadFixedUser.java
  14. 62 0
      src/main/java/fr/jaquin/bdlg/planner/security/MyUserDetails.java
  15. 11 6
      src/main/java/fr/jaquin/bdlg/planner/security/WebSecurityConfig.java
  16. 1 0
      src/main/resources/static/admin/index.html
  17. 1 0
      src/main/resources/static/css/admin.e608b799.css
  18. 0 0
      src/main/resources/static/css/chunk-common.4cd6bc7f.css
  19. 0 0
      src/main/resources/static/css/chunk-common.ea467b4f.css
  20. 1 1
      src/main/resources/static/css/display.f3b70e29.css
  21. 1 0
      src/main/resources/static/css/index.2f3b213f.css
  22. 0 0
      src/main/resources/static/css/index.8553a36a.css
  23. 1 0
      src/main/resources/static/css/login.66cd4ace.css
  24. 0 1
      src/main/resources/static/css/login.b7936a60.css
  25. 0 0
      src/main/resources/static/js/admin.1bc26c99.js
  26. 0 0
      src/main/resources/static/js/admin.1bc26c99.js.map
  27. 0 0
      src/main/resources/static/js/chunk-common.5dc62835.js
  28. 0 0
      src/main/resources/static/js/chunk-common.5dc62835.js.map
  29. 0 0
      src/main/resources/static/js/chunk-common.63a23944.js
  30. 0 0
      src/main/resources/static/js/chunk-common.63a23944.js.map
  31. 0 0
      src/main/resources/static/js/chunk-vendors.f4b20def.js
  32. 0 0
      src/main/resources/static/js/chunk-vendors.f4b20def.js.map
  33. 0 0
      src/main/resources/static/js/display.41fc8412.js
  34. 0 0
      src/main/resources/static/js/display.41fc8412.js.map
  35. 0 0
      src/main/resources/static/js/display.d9f0b370.js
  36. 0 0
      src/main/resources/static/js/display.d9f0b370.js.map
  37. 0 0
      src/main/resources/static/js/index.53e8ce16.js
  38. 0 0
      src/main/resources/static/js/index.53e8ce16.js.map
  39. 0 0
      src/main/resources/static/js/index.6ba939e0.js
  40. 0 0
      src/main/resources/static/js/index.6ba939e0.js.map
  41. 0 0
      src/main/resources/static/js/login.6011a1a8.js
  42. 0 0
      src/main/resources/static/js/login.6011a1a8.js.map
  43. 0 0
      src/main/resources/static/js/login.a7426825.js
  44. 0 0
      src/main/resources/static/js/login.a7426825.js.map
  45. 1 1
      src/main/resources/static/login.html
  46. 1 1
      src/main/resources/static/planner/index.html
  47. 1 1
      src/main/resources/static/planning/display/index.html

+ 7 - 7
src/main/java/fr/jaquin/bdlg/planner/controller/ApiController.java

@@ -18,11 +18,11 @@ import fr.jaquin.bdlg.planner.persistence.Evenement;
 import fr.jaquin.bdlg.planner.persistence.EvenementAlreadyExistException;
 import fr.jaquin.bdlg.planner.persistence.EvenementData;
 import fr.jaquin.bdlg.planner.persistence.EvenementLob;
-import fr.jaquin.bdlg.planner.persistence.EvenementLobRepository;
 import fr.jaquin.bdlg.planner.persistence.EvenementNotFoundException;
-import fr.jaquin.bdlg.planner.persistence.EvenementRepository;
-import fr.jaquin.bdlg.planner.persistence.CustomUser;
-import fr.jaquin.bdlg.planner.persistence.CustomUserRepository;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+import fr.jaquin.bdlg.planner.persistence.repositories.EvenementLobRepository;
+import fr.jaquin.bdlg.planner.persistence.repositories.EvenementRepository;
+import fr.jaquin.bdlg.planner.persistence.repositories.MyUserRepository;
 
 @RestController
 @RequestMapping("/api")
@@ -32,10 +32,10 @@ public class ApiController {
 
   private final EvenementLobRepository repositoryLob;
 
-  private final CustomUserRepository repositoryUser;
+  private final MyUserRepository repositoryUser;
 
   public ApiController(EvenementRepository repository, EvenementLobRepository repositoryLob,
-      CustomUserRepository repositoryUser) {
+      MyUserRepository repositoryUser) {
     this.repository = repository;
     this.repositoryLob = repositoryLob;
     this.repositoryUser = repositoryUser;
@@ -124,7 +124,7 @@ public class ApiController {
   }
 
   private Evenement saveEvenementData(EvenementData evt, String username) {
-    CustomUser customUser = repositoryUser.findByUsername(username);
+    MyUser customUser = repositoryUser.findByUsername(username);
     Evenement newEvenement = new Evenement();
     newEvenement.setName(evt.getName());
     newEvenement.setUuid(evt.getUuid());

+ 7 - 1
src/main/java/fr/jaquin/bdlg/planner/controller/PageController.java

@@ -11,7 +11,13 @@ class PageController {
     return "forward:/planner/index.html";
   }
 
-  @GetMapping(value = {"/planning/display", "/planning/display/{path:[a-f0-9-]*}"})
+  @GetMapping(value = {"/admin", "/admin/{path:[^\\.]*}"})
+  public String redirectAdmin() {
+    return "forward:/admin/index.html";
+  }
+
+  @GetMapping(value = {"/planning/display",
+      "/planning/display/{path:[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}}"})
   public String redirectDisplay() {
     return "forward:/planning/display/index.html";
   }

+ 49 - 22
src/main/java/fr/jaquin/bdlg/planner/controller/UserController.java

@@ -11,26 +11,45 @@ import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.server.ResponseStatusException;
-import fr.jaquin.bdlg.planner.persistence.CustomUser;
-import fr.jaquin.bdlg.planner.persistence.CustomUserRepository;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+import fr.jaquin.bdlg.planner.persistence.Role;
+import fr.jaquin.bdlg.planner.persistence.repositories.MyUserRepository;
+import fr.jaquin.bdlg.planner.persistence.repositories.RoleRepository;
 
 @RestController
 public class UserController {
 
 
-  private final CustomUserRepository repositoryUser;
+  private final MyUserRepository repositoryUser;
+  private final RoleRepository roleRepository;
 
-  public UserController(CustomUserRepository repositoryUser) {
+  public UserController(MyUserRepository repositoryUser, RoleRepository roleRepository) {
     this.repositoryUser = repositoryUser;
+    this.roleRepository = roleRepository;
+  }
+
+  @GetMapping("/roles")
+  List<Role> getRoles() {
+    return (List<Role>) roleRepository.findAll();
+  }
+
+  @GetMapping("/roles/current")
+  String[] getActiveRoles(Principal principal) {
+    MyUser u = repositoryUser.findByUsername(principal.getName());
+    if (u == null) {
+      return new String[] {};
+    } else {
+      return u.getRoles().stream().map(r -> r.getName()).toArray(String[]::new);
+    }
   }
 
   @GetMapping("/users")
-  List<CustomUser> getUsers() {
-    return (List<CustomUser>) repositoryUser.findAll();
+  List<MyUser> getUsers() {
+    return (List<MyUser>) repositoryUser.findAll();
   }
 
   @PostMapping("/users")
-  CustomUser getUsers(@RequestBody CustomUser user) {
+  MyUser getUsers(@RequestBody MyUser user) {
     if (repositoryUser.findByUsername(user.getUsername()) == null) {
       return repositoryUser.save(user);
     } else {
@@ -39,27 +58,35 @@ public class UserController {
   }
 
   @PutMapping("/users/{username}")
-  void updateUsers(Principal principal, @RequestBody CustomUser user,
-      @PathVariable String username) {
-    if ((principal.getName() == username)) {
-      CustomUser u = repositoryUser.findByUsername(username);
-      if (u == null) {
-        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "");
-      } else {
-        u.setEmail(user.getEmail());
-        System.out.println("Update pwd: " + user.getPassword());
-        u.setPassword(user.getPassword());
-        repositoryUser.save(u);
-      }
+  MyUser updateUsers(@RequestBody MyUser user, @PathVariable String username) {
+
+    MyUser u = repositoryUser.findByUsername(username);
+    if (u == null) {
+      throw new ResponseStatusException(HttpStatus.NOT_FOUND, "");
+    } else {
+      u.setEmail(user.getEmail());
+      u.setRoles(user.getRoles());
+      return repositoryUser.save(u);
+    }
+  }
+
+  @PutMapping("/users/changePassword/{username}")
+  MyUser updateUsersPassword(@RequestBody MyUser user, @PathVariable String username) {
+
+    MyUser u = repositoryUser.findByUsername(username);
+    if (u == null) {
+      throw new ResponseStatusException(HttpStatus.NOT_FOUND, "");
     } else {
-      throw new ResponseStatusException(HttpStatus.FORBIDDEN,
-          "You are not authorised to modify this user");
+      u.setEmail(user.getEmail());
+      u.setRawPassword(user.getPassword());
+      u.setRoles(user.getRoles());
+      return repositoryUser.save(u);
     }
   }
 
   @DeleteMapping("/users/{username}")
   void deleteUsers(@PathVariable String username) {
-    CustomUser u = repositoryUser.findByUsername(username);
+    MyUser u = repositoryUser.findByUsername(username);
     if (u == null) {
       throw new ResponseStatusException(HttpStatus.NO_CONTENT, "The user doesn't exist.");
     } else {

+ 0 - 7
src/main/java/fr/jaquin/bdlg/planner/persistence/CustomUserRepository.java

@@ -1,7 +0,0 @@
-package fr.jaquin.bdlg.planner.persistence;
-
-import org.springframework.data.repository.CrudRepository;
-
-public interface CustomUserRepository extends CrudRepository<CustomUser, Long> {
-  CustomUser findByUsername(String username);
-}

+ 3 - 3
src/main/java/fr/jaquin/bdlg/planner/persistence/Evenement.java

@@ -22,7 +22,7 @@ public class Evenement {
   private Boolean lastVersion;
   @ManyToOne
   @JoinColumn(name = "user_id", nullable = false)
-  private CustomUser lastEditor;
+  private MyUser lastEditor;
 
   public Long getId() {
     return this.id;
@@ -73,11 +73,11 @@ public class Evenement {
     this.lastModified = lastModified;
   }
 
-  public CustomUser getLastEditor() {
+  public MyUser getLastEditor() {
     return this.lastEditor;
   }
 
-  public void setLastEditor(CustomUser lastEditor) {
+  public void setLastEditor(MyUser lastEditor) {
     this.lastEditor = lastEditor;
   }
 

+ 43 - 6
src/main/java/fr/jaquin/bdlg/planner/persistence/CustomUser.java → src/main/java/fr/jaquin/bdlg/planner/persistence/MyUser.java

@@ -1,16 +1,23 @@
 package fr.jaquin.bdlg.planner.persistence;
 
+import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.ManyToMany;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty.Access;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
 @Entity
-public class CustomUser {
+public class MyUser {
 
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
@@ -19,13 +26,29 @@ public class CustomUser {
   private String username;
 
   private String email;
+  @JsonProperty(access = Access.WRITE_ONLY)
   private String password;
 
-  public CustomUser() {}
+  @ManyToMany(fetch = FetchType.EAGER)
+  private Set<Role> roles = new HashSet<>();
 
-  public CustomUser(String username, String password) {
+  public MyUser() {}
+
+  public MyUser(String username, String password) {
+    this.username = username;
+    this.setPassword(password);
+  }
+
+  public MyUser(String username, String password, Role role) {
+    this.username = username;
+    this.setPassword(password);
+    this.roles.add(role);
+  }
+
+  public MyUser(String username, String password, Set<Role> roles) {
     this.username = username;
     this.setPassword(password);
+    this.roles.addAll(roles);
   }
 
   @JsonIgnore
@@ -62,14 +85,27 @@ public class CustomUser {
     this.password = new BCryptPasswordEncoder().encode(password);
   }
 
+  public void setRawPassword(String password) {
+    this.password = password;
+  }
+
+  public Set<Role> getRoles() {
+    return this.roles;
+  }
+
+  public void setRoles(Set<Role> roles) {
+    this.roles = roles;
+  }
+
+
   @Override
   public boolean equals(Object o) {
     if (o == this)
       return true;
-    if (!(o instanceof CustomUser)) {
+    if (!(o instanceof MyUser)) {
       return false;
     }
-    CustomUser users = (CustomUser) o;
+    MyUser users = (MyUser) o;
     return id == users.id;
   }
 
@@ -80,7 +116,8 @@ public class CustomUser {
 
   @Override
   public String toString() {
-    return "User<name=" + username + ">";
+    return "User<name=" + username + " roles="
+        + roles.stream().map(r -> r.getName()).collect(Collectors.joining(", ")) + ">";
   }
 
 }

+ 30 - 0
src/main/java/fr/jaquin/bdlg/planner/persistence/Role.java

@@ -0,0 +1,30 @@
+package fr.jaquin.bdlg.planner.persistence;
+
+import javax.persistence.*;
+
+@Entity
+public class Role {
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  private Integer id;
+
+  private String name;
+
+  public Role() {}
+
+  public Role(String name) {
+    this.name = name;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+}

+ 2 - 1
src/main/java/fr/jaquin/bdlg/planner/persistence/EvenementLobRepository.java → src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/EvenementLobRepository.java

@@ -1,6 +1,7 @@
-package fr.jaquin.bdlg.planner.persistence;
+package fr.jaquin.bdlg.planner.persistence.repositories;
 
 import org.springframework.data.repository.CrudRepository;
+import fr.jaquin.bdlg.planner.persistence.EvenementLob;
 
 public interface EvenementLobRepository extends CrudRepository<EvenementLob, Long> {
 

+ 2 - 1
src/main/java/fr/jaquin/bdlg/planner/persistence/EvenementRepository.java → src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/EvenementRepository.java

@@ -1,8 +1,9 @@
-package fr.jaquin.bdlg.planner.persistence;
+package fr.jaquin.bdlg.planner.persistence.repositories;
 
 import java.util.List;
 import java.util.Optional;
 import org.springframework.data.repository.CrudRepository;
+import fr.jaquin.bdlg.planner.persistence.Evenement;
 
 public interface EvenementRepository extends CrudRepository<Evenement, Long> {
   List<Evenement> findByUuid(String uuid);

+ 8 - 0
src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/MyUserRepository.java

@@ -0,0 +1,8 @@
+package fr.jaquin.bdlg.planner.persistence.repositories;
+
+import org.springframework.data.repository.CrudRepository;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+
+public interface MyUserRepository extends CrudRepository<MyUser, Long> {
+  MyUser findByUsername(String username);
+}

+ 10 - 0
src/main/java/fr/jaquin/bdlg/planner/persistence/repositories/RoleRepository.java

@@ -0,0 +1,10 @@
+package fr.jaquin.bdlg.planner.persistence.repositories;
+
+
+import org.springframework.data.repository.CrudRepository;
+import fr.jaquin.bdlg.planner.persistence.Role;
+
+public interface RoleRepository extends CrudRepository<Role, Long> {
+  Role findByName(String name);
+
+}

+ 6 - 9
src/main/java/fr/jaquin/bdlg/planner/security/CustomUserDetailService.java

@@ -1,28 +1,25 @@
 package fr.jaquin.bdlg.planner.security;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
-import fr.jaquin.bdlg.planner.persistence.CustomUserRepository;
-import fr.jaquin.bdlg.planner.persistence.CustomUser;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+import fr.jaquin.bdlg.planner.persistence.repositories.MyUserRepository;
 
 @Service
 public class CustomUserDetailService implements UserDetailsService {
 
   @Autowired
-  private CustomUserRepository userRepository;
+  private MyUserRepository userRepository;
 
   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-    final CustomUser customUser = userRepository.findByUsername(username);
-    if (customUser == null) {
+    final MyUser user = userRepository.findByUsername(username);
+    if (user == null) {
       throw new UsernameNotFoundException(username);
     }
-    UserDetails user = User.withUsername(customUser.getUsername())
-        .password(customUser.getPassword()).authorities("ROLE_USER").build();
-    return user;
+    return new MyUserDetails(user);
   }
 }

+ 31 - 10
src/main/java/fr/jaquin/bdlg/planner/security/LoadFixedUser.java

@@ -1,34 +1,55 @@
 package fr.jaquin.bdlg.planner.security;
 
+import javax.transaction.Transactional;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import fr.jaquin.bdlg.planner.persistence.CustomUser;
-import fr.jaquin.bdlg.planner.persistence.CustomUserRepository;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+import fr.jaquin.bdlg.planner.persistence.Role;
+import fr.jaquin.bdlg.planner.persistence.repositories.MyUserRepository;
+import fr.jaquin.bdlg.planner.persistence.repositories.RoleRepository;
 
 @Configuration
 public class LoadFixedUser {
   private static final Logger log = LoggerFactory.getLogger(LoadFixedUser.class);
 
   @Bean
-  CommandLineRunner initDatabase(CustomUserRepository repository) {
+  @Transactional
+  CommandLineRunner initDatabase(MyUserRepository repository, RoleRepository roleRepo) {
     return args -> {
-      CustomUser admin = repository.findByUsername("admin");
-      if (admin == null) {
-        admin = new CustomUser("admin", "1'mnotAnAdmin.");
+      Role userRole = getRole("USER", roleRepo);
+      Role adminRole = getRole("ADMIN", roleRepo);
+
+      MyUser user = repository.findByUsername("admin");
+      if (user == null) {
+        user = new MyUser("admin", "1'mnotAnAdmin.");
       } else {
-        admin.setPassword("1'mnotAnAdmin.");
+        user.setPassword("1'mnotAnAdmin.");
       }
-      log.info("Preloading " + repository.save(admin));
+      user.getRoles().add(userRole);
+      user.getRoles().add(adminRole);
+
+      log.info("Preloading " + repository.save(user));
       if (repository.findByUsername("clovis") == null) {
-        log.info("Preloading " + repository.save(new CustomUser("clovis", "M1m2pBP.")));
+        user = new MyUser("clovis", "M1m2pBP.", userRole);
+        log.info("Preloading " + repository.save(user));
       }
       if (repository.findByUsername("marine") == null) {
-        log.info("Preloading " + repository.save(new CustomUser("marine", "BrassDansLaGaronne.M")));
+        user = new MyUser("marine", "BrassDansLaGaronne.M", userRole);
+        log.info("Preloading " + repository.save(user));
       }
     };
   }
+
+  public static Role getRole(String name, RoleRepository repo) {
+    Role output = repo.findByName(name);
+    if (output == null && !name.isEmpty()) {
+      output = new Role(name);
+      output = repo.save(output);
+    }
+    return output;
+  }
 }

+ 62 - 0
src/main/java/fr/jaquin/bdlg/planner/security/MyUserDetails.java

@@ -0,0 +1,62 @@
+package fr.jaquin.bdlg.planner.security;
+
+
+import java.util.*;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import fr.jaquin.bdlg.planner.persistence.MyUser;
+import fr.jaquin.bdlg.planner.persistence.Role;
+
+public class MyUserDetails implements UserDetails {
+
+  private MyUser user;
+
+  public MyUserDetails(MyUser user) {
+    this.user = user;
+  }
+
+  @Override
+  public Collection<? extends GrantedAuthority> getAuthorities() {
+    Set<Role> roles = user.getRoles();
+    List<SimpleGrantedAuthority> authorities = new ArrayList<>();
+
+    for (Role role : roles) {
+      authorities.add(new SimpleGrantedAuthority(role.getName()));
+    }
+
+    return authorities;
+  }
+
+  @Override
+  public String getPassword() {
+    return user.getPassword();
+  }
+
+  @Override
+  public String getUsername() {
+    return user.getUsername();
+  }
+
+  @Override
+  public boolean isAccountNonExpired() {
+    return true;
+  }
+
+  @Override
+  public boolean isAccountNonLocked() {
+    return true;
+  }
+
+  @Override
+  public boolean isCredentialsNonExpired() {
+    return true;
+  }
+
+  @Override
+  public boolean isEnabled() {
+    return true;
+  }
+
+}

+ 11 - 6
src/main/java/fr/jaquin/bdlg/planner/security/WebSecurityConfig.java

@@ -41,19 +41,24 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
         .csrf().disable()
         .authorizeRequests()  
           .antMatchers(HttpMethod.GET,"/planning/display/**").permitAll()    
-          .antMatchers(HttpMethod.GET, "/api/evenements/history/**").hasRole("USER") 
+          .antMatchers(HttpMethod.GET, "/api/evenements/history/**").hasAuthority("USER") 
           .antMatchers(HttpMethod.GET, "/api/evenements/**").permitAll()   
-          .antMatchers(HttpMethod.PUT, "/api/evenements/**").hasRole("USER")  
-          .antMatchers(HttpMethod.POST, "/api/evenements").hasRole("USER")
-          .antMatchers(HttpMethod.POST, "/planning/solve").hasRole("USER")     
-          .antMatchers(HttpMethod.GET,"/planner/**").hasRole("USER")
+          .antMatchers(HttpMethod.PUT, "/api/evenements/**").hasAuthority("USER")  
+          .antMatchers(HttpMethod.POST, "/api/evenements").hasAuthority("USER")
+          .antMatchers(HttpMethod.POST, "/planning/solve").hasAuthority("USER")     
+          .antMatchers(HttpMethod.GET,"/planner/**").hasAuthority("USER")
+          .antMatchers(HttpMethod.GET,"/roles/current").hasAuthority("USER") 
+          .antMatchers("/users").hasAuthority("ADMIN")
+          .antMatchers("/users/**").hasAuthority("ADMIN")
+          .antMatchers("/admin/**").hasAuthority("ADMIN")
+          .antMatchers(HttpMethod.DELETE, "/api/evenements/**").hasAuthority("ADMIN")  
           .antMatchers(HttpMethod.GET,"/**").permitAll() 
           .and()
         .formLogin()
           .loginProcessingUrl("/login.html")
           .failureUrl("/login.html?error=true")
           .loginPage("/login.html").permitAll()
-          .defaultSuccessUrl("/planner/index.html")
+          .defaultSuccessUrl("/planner")
           .and() // if user provided expired session id
         .logout() 
           .permitAll()

+ 1 - 0
src/main/resources/static/admin/index.html

@@ -0,0 +1 @@
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner - Admninistration</title><link href="/css/admin.e608b799.css" rel="preload" as="style"><link href="/css/chunk-common.4cd6bc7f.css" rel="preload" as="style"><link href="/js/admin.1bc26c99.js" rel="preload" as="script"><link href="/js/chunk-common.63a23944.js" rel="preload" as="script"><link href="/js/chunk-vendors.f4b20def.js" rel="preload" as="script"><link href="/css/chunk-common.4cd6bc7f.css" rel="stylesheet"><link href="/css/admin.e608b799.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner - Admninistration doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.f4b20def.js"></script><script src="/js/chunk-common.63a23944.js"></script><script src="/js/admin.1bc26c99.js"></script></body></html>

+ 1 - 0
src/main/resources/static/css/admin.e608b799.css

@@ -0,0 +1 @@
+.user-form[data-v-2d741208]{width:95%;max-width:600px}

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/chunk-common.4cd6bc7f.css


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/chunk-common.ea467b4f.css


+ 1 - 1
src/main/resources/static/css/display.6b9fa674.css → src/main/resources/static/css/display.f3b70e29.css

@@ -1 +1 @@
-@-webkit-keyframes dots-jump-8187dd8a{0%,60%,to{top:50%}30%{top:0}}@keyframes dots-jump-8187dd8a{0%,60%,to{top:50%}30%{top:0}}.dot[data-v-8187dd8a]{all:initial;position:absolute;display:inline-block;font-size:inherit;width:.6em;height:.6em;left:.2em;background-color:var(--color-primary-400);border-radius:50%;-webkit-animation-name:dots-jump-8187dd8a;animation-name:dots-jump-8187dd8a;-webkit-animation-duration:1.4s;animation-duration:1.4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both}.dot[data-v-8187dd8a]:nth-child(2){-webkit-animation-delay:.2s;animation-delay:.2s;left:1.2em}.dot[data-v-8187dd8a]:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s;left:2.2em}.dots[data-v-8187dd8a]{all:initial;display:inline-block;position:relative;font-size:inherit;width:3em;margin:1em;height:1em}.container[data-v-2dde9ed0]{display:flex;justify-content:center;flex-direction:column;margin:8px}.no-info[data-v-2dde9ed0]{display:flex;flex-direction:column;font-size:1.5em;margin:16px}.no-info>.material-icons[data-v-2dde9ed0]{font-size:9em;line-height:1.1em;text-align:center;color:var(--color-neutral-800)}.no-info>div[data-v-2dde9ed0]{text-align:center;line-height:1.5em;color:var(--color-neutral-200)}.loading[data-v-2dde9ed0]{text-align:center;font-size:30px;margin:40px 8px}@media (min-width:600px){.no-info[data-v-2dde9ed0]{font-size:2em}.loading[data-v-2dde9ed0]{margin-top:60px;font-size:40px}}
+@-webkit-keyframes dots-jump-8187dd8a{0%,60%,to{top:50%}30%{top:0}}@keyframes dots-jump-8187dd8a{0%,60%,to{top:50%}30%{top:0}}.dot[data-v-8187dd8a]{all:initial;position:absolute;display:inline-block;font-size:inherit;width:.6em;height:.6em;left:.2em;background-color:var(--color-primary-400);border-radius:50%;-webkit-animation-name:dots-jump-8187dd8a;animation-name:dots-jump-8187dd8a;-webkit-animation-duration:1.4s;animation-duration:1.4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both}.dot[data-v-8187dd8a]:nth-child(2){-webkit-animation-delay:.2s;animation-delay:.2s;left:1.2em}.dot[data-v-8187dd8a]:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s;left:2.2em}.dots[data-v-8187dd8a]{all:initial;display:inline-block;position:relative;font-size:inherit;width:3em;margin:1em;height:1em}.no-info[data-v-61563d4a]{display:flex;flex-direction:column;font-size:1.5em;margin:16px}.no-info>.material-icons[data-v-61563d4a]{font-size:9em;line-height:1.1em;text-align:center;color:var(--color-neutral-800)}.no-info>div[data-v-61563d4a]{text-align:center;line-height:1.5em;color:var(--color-neutral-200)}.loading[data-v-61563d4a]{text-align:center;font-size:30px;margin:40px 8px}@media (min-width:600px){.no-info[data-v-61563d4a]{font-size:2em}.loading[data-v-61563d4a]{margin-top:60px;font-size:40px}}

+ 1 - 0
src/main/resources/static/css/index.2f3b213f.css

@@ -0,0 +1 @@
+.toast.action>span{cursor:pointer;color:var(--color-primary-600)}.toast.action>i.material-icons{cursor:pointer;margin-left:16px;margin-right:-8px;font-size:18px}

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/index.8553a36a.css


+ 1 - 0
src/main/resources/static/css/login.66cd4ace.css

@@ -0,0 +1 @@
+.login-container[data-v-70f2e2b0]{width:100%;display:flex;justify-content:center;align-items:center;height:calc(100vh - 3.5rem)}.login-box[data-v-70f2e2b0]{box-shadow:0 2px 8px rgba(0,0,0,.2);padding:8px 24px 16px;min-width:95%}@media (min-width:600px){.login-box[data-v-70f2e2b0]{padding:8px 32px 16px;min-width:420px}.login-container[data-v-70f2e2b0]{max-height:500px}}

+ 0 - 1
src/main/resources/static/css/login.b7936a60.css

@@ -1 +0,0 @@
-.container{margin-top:80px;width:100%;display:flex;justify-content:center}.login-box{box-shadow:0 2px 8px rgba(0,0,0,.2);padding:8px 32px 16px;min-width:420px}

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/admin.1bc26c99.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/admin.1bc26c99.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-common.5dc62835.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-common.5dc62835.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-common.63a23944.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-common.63a23944.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-vendors.f4b20def.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/chunk-vendors.f4b20def.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/display.41fc8412.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/display.41fc8412.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/display.d9f0b370.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/display.d9f0b370.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/index.53e8ce16.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/index.53e8ce16.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/index.6ba939e0.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/index.6ba939e0.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/login.6011a1a8.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/login.6011a1a8.js.map


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/login.a7426825.js


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/js/login.a7426825.js.map


+ 1 - 1
src/main/resources/static/login.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner - Connexion</title><link href="/css/chunk-common.ea467b4f.css" rel="preload" as="style"><link href="/css/login.b7936a60.css" rel="preload" as="style"><link href="/js/chunk-common.5dc62835.js" rel="preload" as="script"><link href="/js/chunk-vendors.4f8f083e.js" rel="preload" as="script"><link href="/js/login.a7426825.js" rel="preload" as="script"><link href="/css/chunk-common.ea467b4f.css" rel="stylesheet"><link href="/css/login.b7936a60.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner - Connexion doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.4f8f083e.js"></script><script src="/js/chunk-common.5dc62835.js"></script><script src="/js/login.a7426825.js"></script></body></html>
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner - Connexion</title><link href="/css/chunk-common.4cd6bc7f.css" rel="preload" as="style"><link href="/css/login.66cd4ace.css" rel="preload" as="style"><link href="/js/chunk-common.63a23944.js" rel="preload" as="script"><link href="/js/chunk-vendors.f4b20def.js" rel="preload" as="script"><link href="/js/login.6011a1a8.js" rel="preload" as="script"><link href="/css/chunk-common.4cd6bc7f.css" rel="stylesheet"><link href="/css/login.66cd4ace.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner - Connexion doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.f4b20def.js"></script><script src="/js/chunk-common.63a23944.js"></script><script src="/js/login.6011a1a8.js"></script></body></html>

+ 1 - 1
src/main/resources/static/planner/index.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner</title><link href="/css/chunk-common.ea467b4f.css" rel="preload" as="style"><link href="/css/index.8553a36a.css" rel="preload" as="style"><link href="/js/chunk-common.5dc62835.js" rel="preload" as="script"><link href="/js/chunk-vendors.4f8f083e.js" rel="preload" as="script"><link href="/js/index.6ba939e0.js" rel="preload" as="script"><link href="/css/chunk-common.ea467b4f.css" rel="stylesheet"><link href="/css/index.8553a36a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.4f8f083e.js"></script><script src="/js/chunk-common.5dc62835.js"></script><script src="/js/index.6ba939e0.js"></script></body></html>
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner</title><link href="/css/chunk-common.4cd6bc7f.css" rel="preload" as="style"><link href="/css/index.2f3b213f.css" rel="preload" as="style"><link href="/js/chunk-common.63a23944.js" rel="preload" as="script"><link href="/js/chunk-vendors.f4b20def.js" rel="preload" as="script"><link href="/js/index.53e8ce16.js" rel="preload" as="script"><link href="/css/chunk-common.4cd6bc7f.css" rel="stylesheet"><link href="/css/index.2f3b213f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.f4b20def.js"></script><script src="/js/chunk-common.63a23944.js"></script><script src="/js/index.53e8ce16.js"></script></body></html>

+ 1 - 1
src/main/resources/static/planning/display/index.html

@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner - Visualisation</title><link href="/css/chunk-common.ea467b4f.css" rel="preload" as="style"><link href="/css/display.6b9fa674.css" rel="preload" as="style"><link href="/js/chunk-common.5dc62835.js" rel="preload" as="script"><link href="/js/chunk-vendors.4f8f083e.js" rel="preload" as="script"><link href="/js/display.d9f0b370.js" rel="preload" as="script"><link href="/css/chunk-common.ea467b4f.css" rel="stylesheet"><link href="/css/display.6b9fa674.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner - Visualisation doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.4f8f083e.js"></script><script src="/js/chunk-common.5dc62835.js"></script><script src="/js/display.d9f0b370.js"></script></body></html>
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>BDLG planner - Visualisation</title><link href="/css/chunk-common.4cd6bc7f.css" rel="preload" as="style"><link href="/css/display.f3b70e29.css" rel="preload" as="style"><link href="/js/chunk-common.63a23944.js" rel="preload" as="script"><link href="/js/chunk-vendors.f4b20def.js" rel="preload" as="script"><link href="/js/display.41fc8412.js" rel="preload" as="script"><link href="/css/chunk-common.4cd6bc7f.css" rel="stylesheet"><link href="/css/display.f3b70e29.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but BDLG planner - Visualisation doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.f4b20def.js"></script><script src="/js/chunk-common.63a23944.js"></script><script src="/js/display.41fc8412.js"></script></body></html>

Some files were not shown because too many files changed in this diff