From 8cfde5920ecc9f73b9166ca6a2db6bd8c06d1af6 Mon Sep 17 00:00:00 2001
From: Sascha Herzinger <sascha.herzinger@uni.lu>
Date: Mon, 17 Jun 2019 15:32:42 +0200
Subject: [PATCH] introduced object domains and removed roles

---
 .../mapviewer/model/security/AccessType.java  |  4 +-
 .../model/security/ObjectPrivilege.java       | 31 +++--------
 .../mapviewer/model/security/Privilege.java   | 36 +++++++++----
 .../model/security/PrivilegeDomain.java       | 52 +++++++++++++++++++
 .../model/security/PrivilegeType.java         | 35 -------------
 .../model/user/ConfigurationElementType.java  |  4 +-
 .../java/lcsb/mapviewer/model/user/User.java  | 15 ------
 .../mapviewer/model/user/AllUserTests.java    |  2 +-
 .../model/user/ObjectPrivilegeTest.java       |  5 +-
 ...TypeTest.java => PrivilegeDomainTest.java} |  8 +--
 .../persist/SpringPersistConfig.java          |  2 -
 .../persist/dao/user/UserDaoTest.java         |  2 -
 .../configuration/ConfigurationRestImpl.java  |  6 +--
 .../api/projects/ProjectController.java       | 16 +++---
 .../projects/overlays/OverlayController.java  |  8 +--
 .../mapviewer/api/users/UserRestImpl.java     | 31 ++++++-----
 .../api/plugins/PluginRestImplTest.java       |  3 --
 .../overlays/OverlayRestImplTest.java         |  3 --
 .../mapviewer/api/users/UserRestImplTest.java |  2 -
 .../services/impl/ConfigurationService.java   |  4 +-
 .../services/impl/LayoutService.java          |  8 +--
 .../services/impl/ProjectService.java         |  6 +--
 .../mapviewer/services/impl/UserService.java  |  4 +-
 .../interfaces/IConfigurationService.java     |  4 +-
 .../services/interfaces/IUserService.java     |  6 +--
 .../impl/ConfigurationServiceTest.java        |  2 -
 .../services/impl/ProjectServiceTest.java     |  5 --
 .../web/config/CustomUserDetailsService.java  |  4 +-
 28 files changed, 143 insertions(+), 165 deletions(-)
 create mode 100644 model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java
 delete mode 100644 model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java
 rename model/src/test/java/lcsb/mapviewer/model/user/{PrivilegeTypeTest.java => PrivilegeDomainTest.java} (70%)

diff --git a/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java b/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java
index aefd916be8..32becc5cce 100644
--- a/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java
+++ b/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java
@@ -1,6 +1,8 @@
 package lcsb.mapviewer.model.security;
 
 public enum AccessType {
+  CREATE,
   READ,
-  WRITE
+  UPDATE,
+  DELETE
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java b/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java
index 312cddd3a3..815773a964 100644
--- a/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java
+++ b/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java
@@ -5,11 +5,6 @@ import java.util.Objects;
 
 import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-
-import lcsb.mapviewer.common.ObjectUtils;
-import lcsb.mapviewer.model.user.User;
 
 /**
  * This class extends {@link Privilege} class which define typical user
@@ -27,21 +22,17 @@ public class ObjectPrivilege extends Privilege implements Serializable {
    */
   private Integer objectId;
 
-  @Enumerated(EnumType.STRING)
-  private AccessType accessType;
-
   public ObjectPrivilege() {
   }
 
-  public ObjectPrivilege(Integer objectId, PrivilegeType type, AccessType accessType) {
-    super(type);
+  public ObjectPrivilege(Integer objectId, PrivilegeDomain type, AccessType accessType) {
+    super(type, accessType);
     this.objectId = objectId;
-    this.accessType = accessType;
   }
 
   @Override
   public String toString() {
-    return getPrivilegeType().name() + ":" + objectId.toString() + ":" + accessType.name();
+    return getPrivilegeDomain().name() + ":" + objectId.toString() + ":" + getAccessType().name();
   }
 
   @Override
@@ -53,17 +44,17 @@ public class ObjectPrivilege extends Privilege implements Serializable {
       return false;
     }
     ObjectPrivilege privilege = (ObjectPrivilege) obj;
-    return privilege.getPrivilegeType() == getPrivilegeType()
-        && privilege.getAccessType() == accessType
+    return privilege.getPrivilegeDomain() == getPrivilegeDomain()
+        && privilege.getAccessType() == getAccessType()
         && Objects.equals(privilege.getObjectId(), objectId);
   }
 
   @Override
   public int hashCode() {
-    if (objectId == null || accessType == null) {
+    if (objectId == null || getPrivilegeDomain() == null || getAccessType() == null) {
       return 0;
     }
-    return Objects.hash(objectId, accessType, getPrivilegeType());
+    return Objects.hash(objectId, getAccessType(), getPrivilegeDomain());
   }
 
   public Integer getObjectId() {
@@ -78,12 +69,4 @@ public class ObjectPrivilege extends Privilege implements Serializable {
     this.objectId = Integer.valueOf(idObject);
   }
 
-  public AccessType getAccessType() {
-    return accessType;
-  }
-
-  public void setAccessType(AccessType accessType) {
-    this.accessType = accessType;
-  }
-
 }
\ No newline at end of file
diff --git a/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java b/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java
index a429762d30..b2191d0a79 100644
--- a/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java
+++ b/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.model.security;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import javax.persistence.*;
 
@@ -17,18 +18,22 @@ public class Privilege implements Serializable {
   private int id;
 
   @Enumerated(EnumType.STRING)
-  private PrivilegeType privilegeType;
+  private PrivilegeDomain privilegeDomain;
+
+  @Enumerated(EnumType.STRING)
+  private AccessType accessType;
 
   public Privilege() {
   }
 
-  public Privilege(PrivilegeType privilegeType) {
-    this.privilegeType = privilegeType;
+  public Privilege(PrivilegeDomain privilegeDomain, AccessType accessType) {
+    this.privilegeDomain = privilegeDomain;
+    this.accessType = accessType;
   }
 
   @Override
   public String toString() {
-    return privilegeType.name();
+    return privilegeDomain.name() + ":" + accessType.name();
   }
 
   @Override
@@ -40,15 +45,16 @@ public class Privilege implements Serializable {
       return false;
     }
     Privilege privilege = ((Privilege) obj);
-    return privilege.getPrivilegeType() == privilegeType;
+    return privilege.getPrivilegeDomain() == privilegeDomain
+        && privilege.getAccessType() == accessType;
   }
 
   @Override
   public int hashCode() {
-    if (privilegeType == null) {
+    if (privilegeDomain == null || accessType == null) {
       return 0;
     }
-    return privilegeType.name().hashCode();
+    return Objects.hash(privilegeDomain, accessType);
   }
 
   public int getId() {
@@ -59,11 +65,19 @@ public class Privilege implements Serializable {
     this.id = id;
   }
 
-  public PrivilegeType getPrivilegeType() {
-    return privilegeType;
+  public PrivilegeDomain getPrivilegeDomain() {
+    return privilegeDomain;
+  }
+
+  public void setPrivilegeDomain(PrivilegeDomain privilegeDomain) {
+    this.privilegeDomain = privilegeDomain;
+  }
+
+  public AccessType getAccessType() {
+    return accessType;
   }
 
-  public void setPrivilegeType(PrivilegeType privilegeType) {
-    this.privilegeType = privilegeType;
+  public void setAccessType(AccessType accessType) {
+    this.accessType = accessType;
   }
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java
new file mode 100644
index 0000000000..bfaa2f2b01
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java
@@ -0,0 +1,52 @@
+package lcsb.mapviewer.model.security;
+
+import lcsb.mapviewer.model.Project;
+import lcsb.mapviewer.model.map.layout.Layout;
+import lcsb.mapviewer.model.user.User;
+
+/**
+ * All privilege domains are non-hierarchical.
+ *
+ * The ability to create and delete projects (PROJECTS_DOMAIN + CREATE/DELETE access), does not imply the ability to
+ * read or write to a singular project (PROJECT_DOMAIN + READ/WRITE access). Mind the plural in the previous sentence.
+ *
+ * There are however overlapping domains. From the perspective of a singular project the ability to delete any project
+ * (PROJECTS_DOMAIN + DELETE access) is no different than the ability to delete the project itself (PROJECT_DOMAIN + DELETE access).
+ *
+ * Please note that ObjectPrivilege domains are specific to a certain object, whereas Privilege domains are usually
+ * more general.
+ */
+public enum PrivilegeDomain {
+
+  PROJECT_DOMAIN(ObjectPrivilege.class, Project.class, ""),
+  OVERLAY_DOMAIN(ObjectPrivilege.class, Layout.class, ""),
+  USER_DOMAIN(ObjectPrivilege.class, User.class, ""),
+  PROJECTS_DOMAIN(Privilege.class, null, ""),
+  OVERLAYS_DOMAIN(Privilege.class, null, ""),
+  ADMIN_DOMAIN(Privilege.class, null, "");
+
+  private Class<? extends Privilege> privilegeClassType;
+
+  private Class<?> privilegeObjectType;
+
+  private String description;
+
+  PrivilegeDomain(Class<? extends Privilege> privilegeClazz, Class<?> objectClazz, String description) {
+    this.privilegeClassType = privilegeClazz;
+    this.privilegeObjectType = objectClazz;
+    this.description = description;
+  }
+
+  public Class<? extends Privilege> getPrivilegeClassType() {
+    return privilegeClassType;
+  }
+
+  public Class<?> getPrivilegeObjectType() {
+    return privilegeObjectType;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+}
\ No newline at end of file
diff --git a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java
deleted file mode 100644
index 8e9f984b44..0000000000
--- a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package lcsb.mapviewer.model.security;
-
-import lcsb.mapviewer.model.Project;
-import lcsb.mapviewer.model.map.layout.Layout;
-
-public enum PrivilegeType {
-
-  PROJECT_DOMAIN_ACCESS(ObjectPrivilege.class, Project.class, "Access to project domain."),
-  OVERLAY_DOMAIN_ACCESS(ObjectPrivilege.class, Layout.class, "Access to overlay domain.");
-
-  private Class<? extends Privilege> privilegeClassType;
-
-  private Class<?> privilegeObjectType;
-
-  private String description;
-
-  PrivilegeType(Class<? extends Privilege> privilegeClazz, Class<?> objectClazz, String description) {
-    this.privilegeClassType = privilegeClazz;
-    this.privilegeObjectType = objectClazz;
-    this.description = description;
-  }
-
-  public Class<? extends Privilege> getPrivilegeClassType() {
-    return privilegeClassType;
-  }
-
-  public Class<?> getPrivilegeObjectType() {
-    return privilegeObjectType;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-}
\ No newline at end of file
diff --git a/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java b/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java
index 6c2569f338..b1953690ec 100644
--- a/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java
+++ b/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java
@@ -1,6 +1,6 @@
 package lcsb.mapviewer.model.user;
 
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 
 /**
  * This enumerate defines all possible configuration parameter that are
@@ -210,7 +210,7 @@ public enum ConfigurationElementType {
       "Dear Disease map team,\nI would like to request an account in the system.\nKind regards",
       ConfigurationElementEditType.TEXT, false, ConfigurationElementTypeGroup.EMAIL_NOTIFICATION),
 
-  DEFAULT_VIEW_PROJECT("Default user privilege for: " + PrivilegeType.PROJECT_DOMAIN_ACCESS.getDescription(), "true",
+  DEFAULT_VIEW_PROJECT("Default user privilege for: " + PrivilegeDomain.PROJECT_DOMAIN.getDescription(), "true",
       ConfigurationElementEditType.BOOLEAN, false, ConfigurationElementTypeGroup.DEFAULT_USER_PRIVILEGES),
 
   SHOW_REACTION_TYPE("Show reaction type", "true", ConfigurationElementEditType.BOOLEAN, false,
diff --git a/model/src/main/java/lcsb/mapviewer/model/user/User.java b/model/src/main/java/lcsb/mapviewer/model/user/User.java
index d044cce5bc..64f8433f55 100644
--- a/model/src/main/java/lcsb/mapviewer/model/user/User.java
+++ b/model/src/main/java/lcsb/mapviewer/model/user/User.java
@@ -3,19 +3,15 @@ package lcsb.mapviewer.model.user;
 import java.awt.Color;
 import java.io.Serializable;
 import java.util.Calendar;
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Set;
 
 import javax.persistence.*;
 
 import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.security.RoleType;
 import org.hibernate.annotations.Cascade;
 
-import lcsb.mapviewer.common.comparator.StringComparator;
-
 @Entity
 public class User implements Serializable {
 
@@ -79,9 +75,6 @@ public class User implements Serializable {
   )
   private Set<Privilege> privileges = new HashSet<>();
 
-  @Enumerated(EnumType.STRING)
-  private RoleType role;
-
   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn
   private UserAnnotationSchema annotationSchema;
@@ -153,14 +146,6 @@ public class User implements Serializable {
     this.privileges = privileges;
   }
 
-  public RoleType getRole() {
-    return role;
-  }
-
-  public void setRole(RoleType role) {
-    this.role = role;
-  }
-
   public boolean isRemoved() {
     return removed;
   }
diff --git a/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java b/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java
index 50bfcea41c..92ccc55185 100644
--- a/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java
+++ b/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java
@@ -13,7 +13,7 @@ import lcsb.mapviewer.model.user.annotator.AllAnnotatorTests;
     ConfigurationElementEditTypeTest.class,
     ConfigurationTest.class,
     ObjectPrivilegeTest.class,
-    PrivilegeTypeTest.class,
+    PrivilegeDomainTest.class,
     UserAnnotationSchemaTest.class,
     UserClassAnnotatorsTest.class,
     UserClassRequiredAnnotationsTest.class,
diff --git a/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java b/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java
index 21831a69a8..3dc25e4a14 100644
--- a/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java
@@ -7,8 +7,7 @@ import static org.junit.Assert.assertTrue;
 
 import lcsb.mapviewer.model.security.AccessType;
 import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import org.apache.commons.lang3.SerializationUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -42,7 +41,7 @@ public class ObjectPrivilegeTest {
       Integer id = 12;
       Project project = new Project();
       project.setId(id);
-      ObjectPrivilege privilege = new ObjectPrivilege(project.getId(), PrivilegeType.PROJECT_DOMAIN_ACCESS, AccessType.READ);
+      ObjectPrivilege privilege = new ObjectPrivilege(project.getId(), PrivilegeDomain.PROJECT_DOMAIN, AccessType.READ);
       assertEquals(id, privilege.getObjectId());
     } catch (Exception e) {
       e.printStackTrace();
diff --git a/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java b/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java
similarity index 70%
rename from model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java
rename to model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java
index 947a4ff170..74e358a540 100644
--- a/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java
+++ b/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java
@@ -2,12 +2,12 @@ package lcsb.mapviewer.model.user;
 
 import static org.junit.Assert.assertNotNull;
 
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-public class PrivilegeTypeTest {
+public class PrivilegeDomainTest {
 
 	@Before
 	public void setUp() throws Exception {
@@ -19,11 +19,11 @@ public class PrivilegeTypeTest {
 
 	@Test
 	public void testValidValues() {
-		for (PrivilegeType type : PrivilegeType.values()) {
+		for (PrivilegeDomain type : PrivilegeDomain.values()) {
 			assertNotNull(type);
 
 			// for coverage tests
-			PrivilegeType.valueOf(type.toString());
+			PrivilegeDomain.valueOf(type.toString());
 			assertNotNull(type.getDescription());
 			assertNotNull(type.getPrivilegeClassType());
 		}
diff --git a/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java b/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java
index 95af7afba5..3e16648477 100644
--- a/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java
+++ b/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java
@@ -11,8 +11,6 @@ import org.springframework.jdbc.datasource.init.DataSourceInitializer;
 import org.springframework.jdbc.datasource.init.DatabasePopulator;
 import org.springframework.orm.hibernate5.HibernateTransactionManager;
 import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
-import org.springframework.security.crypto.password.MessageDigestPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import javax.sql.DataSource;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
index 860432faaf..ec5bee7d1d 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java
@@ -19,8 +19,6 @@ import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.species.Species;
 import lcsb.mapviewer.model.user.AnnotatorParamDefinition;
-import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.model.user.UserClassAnnotators;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
index 26b84213e0..7006e6adaf 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
@@ -9,6 +9,7 @@ import java.util.Queue;
 import java.util.Set;
 import java.util.TreeMap;
 
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import org.apache.logging.log4j.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,7 +35,6 @@ import lcsb.mapviewer.model.map.species.field.ModificationState;
 import lcsb.mapviewer.model.user.ConfigurationElementEditType;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ConfigurationOption;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.annotator.BioEntityField;
 import lcsb.mapviewer.modelutils.map.ClassTreeNode;
 import lcsb.mapviewer.modelutils.map.ElementUtils;
@@ -208,13 +208,13 @@ public class ConfigurationRestImpl extends BaseRestImpl {
 
   public Map<String, Object> getPrivilegeTypes() {
     Map<String, Object> result = new TreeMap<>();
-    for (PrivilegeType type : PrivilegeType.values()) {
+    for (PrivilegeDomain type : PrivilegeDomain.values()) {
       result.put(type.name(), createPrivilegeTypeResponse(type));
     }
     return result;
   }
 
-  private Map<String, Object> createPrivilegeTypeResponse(PrivilegeType type) {
+  private Map<String, Object> createPrivilegeTypeResponse(PrivilegeDomain type) {
     Map<String, Object> result = new TreeMap<>();
     result.put("commonName", type.getDescription());
     if (type.getPrivilegeObjectType() != null) {
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
index 057112fc32..23b6daf0cf 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
@@ -5,18 +5,17 @@ import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletContext;
-
-import lcsb.mapviewer.model.user.User;
-import lcsb.mapviewer.services.impl.UserService;
-import lcsb.mapviewer.services.interfaces.IUserService;
 import org.apache.logging.log4j.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.Authentication;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.bind.annotation.*;
 
+import lcsb.mapviewer.model.user.User;
+import lcsb.mapviewer.services.interfaces.IUserService;
 import lcsb.mapviewer.api.BaseController;
 import lcsb.mapviewer.api.ObjectNotFoundException;
 import lcsb.mapviewer.api.QueryException;
@@ -26,8 +25,6 @@ import lcsb.mapviewer.services.SecurityException;
 @RestController
 @RequestMapping(value = "/projects", produces = MediaType.APPLICATION_JSON_VALUE)
 public class ProjectController extends BaseController {
-  @SuppressWarnings("unused")
-  private Logger logger = LogManager.getLogger(ProjectController.class);
 
   private ServletContext context;
   private ProjectRestImpl projectController;
@@ -40,12 +37,14 @@ public class ProjectController extends BaseController {
     this.userService = userService;
   }
 
+  @PreAuthorize("hasRole('ADMIN') or hasPermission(#projectId, 'Project', 'READ')")
   @GetMapping(value = "/{projectId:.+}")
-  public Map<String, Object> getProject(@PathVariable(value = "projectId") String projectId
-  ) throws ObjectNotFoundException {
+  public Map<String, Object> getProject(@PathVariable(value = "projectId") String projectId)
+      throws ObjectNotFoundException {
     return projectController.getProject(projectId);
   }
 
+  @PreAuthorize("hasRole('ADMIN') or hasPermission(#projectId, 'Project', 'WRITE')")
   @PatchMapping(value = "/{projectId:.+}")
   public Map<String, Object> updateProject(
       @RequestBody String body,
@@ -56,6 +55,7 @@ public class ProjectController extends BaseController {
     return projectController.updateProject(projectId, data);
   }
 
+  @PreAuthorize("hasAnyRole('ADMIN', 'CURATOR')")
   @PostMapping(value = "/{projectId:.+}")
   public Map<String, Object> addProject(
       Authentication authentication,
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
index 3b9777ef66..db1892e08d 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PostFilter;
@@ -13,7 +14,6 @@ import org.springframework.web.bind.annotation.*;
 
 import lcsb.mapviewer.model.security.AccessType;
 import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.services.interfaces.IUserService;
 import lcsb.mapviewer.api.BaseController;
@@ -110,9 +110,9 @@ public class OverlayController extends BaseController {
       Map<String, Object> overlay = overlayRestImp.addOverlay(
           projectId, name, description, content, fileId, filename, type, googleLicenseConsent, user);
       userService.grantUserPrivilege(
-          user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ));
+          user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ));
       userService.grantUserPrivilege(
-          user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.WRITE));
+          user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.WRITE));
       return overlay;
   }
 
@@ -124,7 +124,7 @@ public class OverlayController extends BaseController {
       @PathVariable(value = "projectId") String projectId,
       @PathVariable(value = "overlayId") String overlayId) throws QueryException, IOException {
     Map<String, Object> response = overlayRestImp.removeOverlay(projectId, overlayId);
-    userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.OVERLAY_DOMAIN_ACCESS, Integer.valueOf(overlayId));
+    userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, Integer.valueOf(overlayId));
     return response;
   }
 
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
index ea05828a6f..19d4d196a7 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
@@ -2,7 +2,7 @@ package lcsb.mapviewer.api.users;
 
 import java.util.*;
 
-import lcsb.mapviewer.model.security.AccessType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import lcsb.mapviewer.services.impl.Md5PasswordEncoder;
 import org.apache.logging.log4j.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +23,6 @@ import lcsb.mapviewer.model.user.AnnotatorParamDefinition;
 import lcsb.mapviewer.model.user.ConfigurationOption;
 import lcsb.mapviewer.model.security.ObjectPrivilege;
 import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.model.user.UserClassAnnotators;
@@ -509,24 +508,24 @@ public class UserRestImpl extends BaseRestImpl {
 
   private List<Map<String, Object>> preparePrivileges(User user) {
     List<Map<String, Object>> result = new ArrayList<>();
-    Set<PrivilegeType> definedDefaultProjectPrivilegeTypes = new LinkedHashSet<>();
+    Set<PrivilegeDomain> definedDefaultProjectPrivilegeDomains = new LinkedHashSet<>();
     List<Privilege> privileges = new ArrayList<>();
     privileges.addAll(user.getPrivileges());
     for (Privilege privilege : privileges) {
       if (privilege instanceof ObjectPrivilege) {
-        if (Project.class.equals(privilege.getPrivilegeType().getPrivilegeObjectType())
+        if (Project.class.equals(privilege.getPrivilegeDomain().getPrivilegeObjectType())
             && ((ObjectPrivilege) privilege).getObjectId() == null) {
-          definedDefaultProjectPrivilegeTypes.add(privilege.getPrivilegeType());
+          definedDefaultProjectPrivilegeDomains.add(privilege.getPrivilegeDomain());
         }
         result.add(prepareObjectPrivilege((ObjectPrivilege) privilege));
       } else {
         result.add(preparePrivilege(privilege));
       }
     }
-    for (PrivilegeType privilegeType : PrivilegeType.values()) {
-      if (Project.class.equals(privilegeType.getPrivilegeObjectType())
-          && !definedDefaultProjectPrivilegeTypes.contains(privilegeType)) {
-        result.add(prepareDefaultObjectPrivilege(privilegeType));
+    for (PrivilegeDomain privilegeDomain : PrivilegeDomain.values()) {
+      if (Project.class.equals(privilegeDomain.getPrivilegeObjectType())
+          && !definedDefaultProjectPrivilegeDomains.contains(privilegeDomain)) {
+        result.add(prepareDefaultObjectPrivilege(privilegeDomain));
       }
     }
     Map<String, Object> customLayouts = new TreeMap<>();
@@ -534,10 +533,10 @@ public class UserRestImpl extends BaseRestImpl {
     return result;
   }
 
-  private Map<String, Object> prepareDefaultObjectPrivilege(PrivilegeType privilegeType) {
+  private Map<String, Object> prepareDefaultObjectPrivilege(PrivilegeDomain privilegeDomain) {
     Map<String, Object> result = new TreeMap<>();
-    result.put("type", privilegeType);
-    ConfigurationOption value = configurationService.getValue(privilegeType);
+    result.put("type", privilegeDomain);
+    ConfigurationOption value = configurationService.getValue(privilegeDomain);
     if (value == null) {
       result.put("value", 0);
     } else if (value.getValue().equalsIgnoreCase("true")) {
@@ -553,7 +552,7 @@ public class UserRestImpl extends BaseRestImpl {
 
   private Map<String, Object> prepareObjectPrivilege(ObjectPrivilege privilege) {
     Map<String, Object> result = new TreeMap<>();
-    result.put("privilegeType", privilege.getPrivilegeType());
+    result.put("privilegeType", privilege.getPrivilegeDomain());
     result.put("accessType", privilege.getAccessType());
     result.put("objectId", privilege.getObjectId());
     return result;
@@ -562,7 +561,7 @@ public class UserRestImpl extends BaseRestImpl {
   private Map<String, Object> preparePrivilege(Privilege privilege) {
     Map<String, Object> result = new TreeMap<>();
     if (privilege.getClass().equals(Privilege.class)) {
-      result.put("privilegeType", privilege.getPrivilegeType());
+      result.put("privilegeType", privilege.getPrivilegeDomain());
       return result;
     } else {
       throw new InvalidArgumentException("Don't know how to handle class: " + privilege.getClass());
@@ -590,10 +589,10 @@ public class UserRestImpl extends BaseRestImpl {
       for (String key : privilegesData.keySet()) {
         Object value = privilegesData.get(key);
 
-        PrivilegeType type = PrivilegeType.valueOf(key);
+        PrivilegeDomain type = PrivilegeDomain.valueOf(key);
 
         if (type.getPrivilegeClassType().equals(Privilege.class)) {
-          getUserService().grantUserPrivilege(modifiedUser, new Privilege(type));
+          getUserService().grantUserPrivilege(modifiedUser, new Privilege(type, accessType));
         } else if (type.getPrivilegeClassType().equals(ObjectPrivilege.class)) {
           if (value instanceof Map) {
             Map<?, ?> objects = (Map<?, ?>) value;
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java
index a86d7f4df4..d05034cbbd 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java
@@ -4,9 +4,6 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import lcsb.mapviewer.api.RestTestFunctions;
-import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
-import lcsb.mapviewer.model.user.User;
 
 public class PluginRestImplTest extends RestTestFunctions {
 
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java
index 8408f42dde..a7e4c47115 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java
@@ -15,9 +15,6 @@ import lcsb.mapviewer.api.RestTestFunctions;
 import lcsb.mapviewer.model.Project;
 import lcsb.mapviewer.model.map.layout.ColorSchemaType;
 import lcsb.mapviewer.model.map.model.Model;
-import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.persist.dao.ProjectDao;
 import lcsb.mapviewer.services.interfaces.IProjectService;
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java
index fef817156b..76d4a83691 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java
@@ -7,7 +7,6 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -31,7 +30,6 @@ import lcsb.mapviewer.api.RestTestFunctions;
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.user.AnnotatorParamDefinition;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.UserGuiPreference;
 import lcsb.mapviewer.model.user.annotator.AnnotatorConfigParameter;
 import lcsb.mapviewer.model.user.annotator.AnnotatorInputParameter;
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
index d84cc2ba4a..2ba11ee041 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
@@ -3,6 +3,7 @@ package lcsb.mapviewer.services.impl;
 import java.util.ArrayList;
 import java.util.List;
 
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import org.apache.commons.lang3.EnumUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.*;
@@ -16,7 +17,6 @@ import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.model.user.ConfigurationElementEditType;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ConfigurationOption;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.persist.dao.ConfigurationDao;
 import lcsb.mapviewer.services.interfaces.IConfigurationService;
 
@@ -171,7 +171,7 @@ public class ConfigurationService implements IConfigurationService {
   }
 
   @Override
-  public ConfigurationOption getValue(PrivilegeType type) {
+  public ConfigurationOption getValue(PrivilegeDomain type) {
     String name = "DEFAULT_" + type.name();
     if (EnumUtils.isValidEnum(ConfigurationElementType.class, name)) {
       return getValue(ConfigurationElementType.valueOf(name));
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
index 98e9437349..b41994151b 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
@@ -47,7 +47,7 @@ import lcsb.mapviewer.model.map.model.ModelSubmodelConnection;
 import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.persist.DbUtils;
 import lcsb.mapviewer.persist.dao.map.LayoutDao;
@@ -135,7 +135,7 @@ public class LayoutService implements ILayoutService {
       email = null;
     }
 
-    userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.OVERLAY_DOMAIN_ACCESS, layout.getId());
+    userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, layout.getId());
     layout.getProject().removeLayout(layout);
     layoutDao.delete(layout);
 
@@ -171,14 +171,14 @@ public class LayoutService implements ILayoutService {
   @Override
   public void grantViewAccess(Layout layout, User user) {
     userService.grantUserPrivilege(
-        user, new ObjectPrivilege(layout.getId(), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ)
+        user, new ObjectPrivilege(layout.getId(), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ)
     );
   }
 
   @Override
   public void revokeViewAccess(Layout layout, User user) {
     userService.revokeUserPrivilege(
-        user, new ObjectPrivilege(layout.getId(), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ)
+        user, new ObjectPrivilege(layout.getId(), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ)
     );
   }
 
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
index e6fe98afc5..96fb532f10 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -18,7 +18,6 @@ import java.util.concurrent.CountDownLatch;
 import javax.mail.MessagingException;
 
 import lcsb.mapviewer.converter.*;
-import lcsb.mapviewer.model.security.AccessType;
 import org.apache.commons.io.FileUtils;
 import org.apache.logging.log4j.*;
 import org.hibernate.HibernateException;
@@ -63,8 +62,7 @@ import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelData;
 import lcsb.mapviewer.model.map.model.ModelSubmodelConnection;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
-import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.model.user.UserClassAnnotators;
@@ -311,7 +309,7 @@ public class ProjectService implements IProjectService {
               }
             }
           }
-          userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.PROJECT_DOMAIN_ACCESS, project.getId());
+          userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.PROJECT_DOMAIN_ACCESS, project.getId());
           projectDao.delete(project);
           if (async) {
             projectDao.commit();
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
index a49b2010bc..c94791ed50 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
@@ -94,10 +94,10 @@ public class UserService implements IUserService {
   }
 
   @Override
-  public void revokeObjectDomainPrivilegesForAllUsers(PrivilegeType privilegeType, Integer objectId) {
+  public void revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain privilegeDomain, Integer objectId) {
     for (AccessType accessType : AccessType.values()) {
       for (User user : userDao.getAll()) {
-        ObjectPrivilege privilege = new ObjectPrivilege(objectId, privilegeType, accessType);
+        ObjectPrivilege privilege = new ObjectPrivilege(objectId, privilegeDomain, accessType);
         user.revokePrivilege(privilege);
       }
     }
diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java
index e4d307c6db..60e87e3481 100644
--- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java
@@ -3,9 +3,9 @@ package lcsb.mapviewer.services.interfaces;
 import java.util.List;
 
 import lcsb.mapviewer.common.FrameworkVersion;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ConfigurationOption;
-import lcsb.mapviewer.model.security.PrivilegeType;
 
 /**
  * Service used for accessing and modifying configuration parameters.
@@ -114,5 +114,5 @@ public interface IConfigurationService {
 
   ConfigurationOption getValue(ConfigurationElementType type);
 
-  ConfigurationOption getValue(PrivilegeType type);
+  ConfigurationOption getValue(PrivilegeDomain type);
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
index cacdc9c4cc..e075565611 100644
--- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java
@@ -6,7 +6,7 @@ import java.util.Map;
 
 import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.model.security.Privilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
+import lcsb.mapviewer.model.security.PrivilegeDomain;
 import lcsb.mapviewer.model.security.RoleType;
 import lcsb.mapviewer.model.user.User;
 
@@ -36,11 +36,11 @@ public interface IUserService {
    * When an object is deleted we have to manually remove the access rights to it for every user to avoid pollution.
    * Hibernate delete cascading does not work here, because security is completely decoupled from the business logic.
    *
-   * @param privilegeType The concerned privilege domain.
+   * @param privilegeDomain The concerned privilege domain.
    * @param objectId The objectId for which to remove all access rights.
    *
    */
-  void revokeObjectDomainPrivilegesForAllUsers(PrivilegeType privilegeType, Integer objectId);
+  void revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain privilegeDomain, Integer objectId);
 
   /**
    * Returns {@link ColorExtractor} that transform overlay values into colors for given user.
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java
index 036178c633..7f1adb2138 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java
@@ -15,10 +15,8 @@ import org.springframework.test.annotation.Rollback;
 
 import lcsb.mapviewer.common.Configuration;
 import lcsb.mapviewer.common.FrameworkVersion;
-import lcsb.mapviewer.model.Project;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ConfigurationOption;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.services.ServiceTestFunctions;
 
 @Rollback(true)
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
index abb718550f..96e6a7244c 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
@@ -18,12 +18,10 @@ import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import lcsb.mapviewer.model.security.Privilege;
 import org.apache.logging.log4j.*;
 import org.apache.poi.util.IOUtils;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.primefaces.model.TreeNode;
@@ -55,9 +53,6 @@ import lcsb.mapviewer.model.map.model.SubmodelType;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.Protein;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
-import lcsb.mapviewer.model.user.ConfigurationOption;
-import lcsb.mapviewer.model.security.ObjectPrivilege;
-import lcsb.mapviewer.model.security.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
 import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.model.user.UserClassAnnotators;
diff --git a/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java b/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java
index e71b314f72..f1b774d31e 100644
--- a/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java
+++ b/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java
@@ -34,10 +34,10 @@ public class CustomUserDetailsService implements UserDetailsService {
     List<GrantedAuthority> authorities = user.getPrivileges().stream()
         .map(privilege -> new SimpleGrantedAuthority(privilege.toString()))
         .collect(Collectors.toList());
-    return org.springframework.security.core.userdetails.User.withUsername(username)
+    return org.springframework.security.core.userdetails.User
+        .withUsername(username)
         .password(user.getCryptedPassword())
         .disabled(user.isRemoved())
-        .roles(user.getRole().name())
         .authorities(authorities)
         .build();
   }
-- 
GitLab