Add roles for relationship between user and applications.

This commit is contained in:
2019-09-01 12:51:48 +02:00
parent dcb5b73599
commit 21c2c514d5
6 changed files with 123 additions and 30 deletions

View File

@@ -24,13 +24,8 @@ public class Application {
@OneToMany(mappedBy = "application") @OneToMany(mappedBy = "application")
private List<ConfigurationFile> configurationFileList; private List<ConfigurationFile> configurationFileList;
@ManyToMany @OneToMany(mappedBy = "application")
@JoinTable( private List<ApplicationRole> administratorList;
name = "administrator",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "application_id", referencedColumnName = "id")
)
private List<User> administratorList;
public String getId() { public String getId() {
return id; return id;
@@ -64,11 +59,11 @@ public class Application {
this.configurationFileList = configurationFileList; this.configurationFileList = configurationFileList;
} }
public List<User> getAdministratorList() { public List<ApplicationRole> getAdministratorList() {
return administratorList; return administratorList;
} }
public void setAdministratorList(List<User> administratorList) { public void setAdministratorList(List<ApplicationRole> administratorList) {
this.administratorList = administratorList; this.administratorList = administratorList;
} }
} }

View File

@@ -0,0 +1,86 @@
package org.cerberus.entities.persistence;
import org.cerberus.constant.Role;
import javax.persistence.*;
import java.io.Serializable;
import static javax.persistence.FetchType.LAZY;
@Entity
@Table(name = "application_role")
public class ApplicationRole {
@Embeddable
public static class ApplicationRoleId implements Serializable {
@Column(name = "user_id")
private String userId;
@Column(name = "application_id")
private String applicationId;
String getUserId() {
return userId;
}
void setUserId(String userId) {
this.userId = userId;
}
String getApplicationId() {
return applicationId;
}
void setApplicationId(String applicationId) {
this.applicationId = applicationId;
}
}
@EmbeddedId
private ApplicationRoleId id;
@Enumerated
private Role role;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private User user;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "application_id", insertable = false, updatable = false)
private Application application;
public ApplicationRoleId getId() {
if(id == null) {
id = new ApplicationRoleId();
}
return id;
}
public void setId(ApplicationRoleId id) {
this.id = id;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Application getApplication() {
return application;
}
public void setApplication(Application application) {
this.application = application;
}
}

View File

@@ -25,17 +25,12 @@ public class User {
@Column(nullable = false) @Column(nullable = false)
private String password; private String password;
@Column(name = "inscription_date", nullable = false) @Column(nullable = false)
@Generated(GenerationTime.ALWAYS) @Generated(GenerationTime.ALWAYS)
private LocalDate inscriptionDate; private LocalDate inscriptionDate;
@ManyToMany @OneToMany(mappedBy = "user")
@JoinTable( private List<ApplicationRole> applicationRoleList;
name = "administrator",
joinColumns = @JoinColumn(name = "application_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)
private List<Application> applicationList;
public String getId() { public String getId() {
return id; return id;
@@ -77,11 +72,11 @@ public class User {
this.inscriptionDate = inscriptionDate; this.inscriptionDate = inscriptionDate;
} }
public List<Application> getApplicationList() { public List<ApplicationRole> getApplicationRoleList() {
return applicationList; return applicationRoleList;
} }
public void setApplicationList(List<Application> applicationList) { public void setApplicationRoleList(List<ApplicationRole> applicationRoleList) {
this.applicationList = applicationList; this.applicationRoleList = applicationRoleList;
} }
} }

View File

@@ -1,13 +1,18 @@
package org.cerberus.repositories; package org.cerberus.repositories;
import org.cerberus.entities.persistence.ApplicationRole;
import org.cerberus.entities.persistence.User; import org.cerberus.entities.persistence.User;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public interface UserRepository extends JpaRepository<User, String> { public interface UserRepository extends JpaRepository<User, String> {
@Query("SELECT u FROM User u WHERE u.email = :email") @Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmail(@Param("email") String email); Optional<User> findByEmail(@Param("email") String email);
@Query("SELECT ar FROM ApplicationRole ar JOIN FETCH ar.application WHERE ar.user.email = :email")
List<ApplicationRole> getApplicationRolesByEmail(@Param("email") String email);
} }

View File

@@ -1,16 +1,19 @@
package org.cerberus.services; package org.cerberus.services;
import org.cerberus.constant.Role;
import org.cerberus.core.config.security.CustomAuthenticationProvider; import org.cerberus.core.config.security.CustomAuthenticationProvider;
import org.cerberus.core.exceptions.BadRequestException; import org.cerberus.core.exceptions.BadRequestException;
import org.cerberus.entities.persistence.ApplicationRole;
import org.cerberus.entities.persistence.User; import org.cerberus.entities.persistence.User;
import org.cerberus.repositories.UserRepository; import org.cerberus.repositories.UserRepository;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.swing.text.html.Option; import java.util.Collection;
import java.util.Collections;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
@Service @Service
public class UserService { public class UserService {
@@ -28,7 +31,7 @@ public class UserService {
authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken( authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken(
user.getEmail(), user.getEmail(),
user.getPassword(), user.getPassword(),
Collections.singleton(new SimpleGrantedAuthority("APPLICATION_ADMIN")) fetchGrantedAuthorities(user)
)); ));
} }
@@ -39,4 +42,12 @@ public class UserService {
throw new BadRequestException("Credentials are incorrect."); throw new BadRequestException("Credentials are incorrect.");
} }
} }
Collection<GrantedAuthority> fetchGrantedAuthorities(User user) {
return userRepository.getApplicationRolesByEmail(user.getEmail()).stream()
.map(ApplicationRole::getRole)
.map(Role::name)
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
}
} }

View File

@@ -23,12 +23,13 @@ CREATE TABLE configuration_file (
); );
CREATE INDEX configuration_file_application_id_idx ON configuration_file(application_id); CREATE INDEX configuration_file_application_id_idx ON configuration_file(application_id);
CREATE TABLE administrator ( CREATE TABLE application_role (
user_id uuid NOT NULL, user_id uuid NOT NULL,
application_id uuid NOT NULL, application_id uuid NOT NULL,
CONSTRAINT administrator_pk PRIMARY KEY (user_id, application_id), role SMALLINT NOT NULL,
CONSTRAINT administrator_user_id FOREIGN KEY (user_id) REFERENCES "user" (id), CONSTRAINT application_role_pk PRIMARY KEY (user_id, application_id),
CONSTRAINT administrator_application_id FOREIGN KEY (application_id) REFERENCES application (id) CONSTRAINT application_role_user_id FOREIGN KEY (user_id) REFERENCES "user" (id),
CONSTRAINT application_role_application_id FOREIGN KEY (application_id) REFERENCES application (id)
); );
CREATE INDEX administrator_user_id_idx ON administrator(user_id); CREATE INDEX application_role_user_id_idx ON application_role(user_id);
CREATE INDEX administrator_application_id_idx ON administrator(application_id); CREATE INDEX application_role_application_id_idx ON application_role(application_id);