diff --git a/src/main/java/org/cerberus/entities/persistence/Application.java b/src/main/java/org/cerberus/entities/persistence/Application.java index d3e2079..be07d70 100644 --- a/src/main/java/org/cerberus/entities/persistence/Application.java +++ b/src/main/java/org/cerberus/entities/persistence/Application.java @@ -24,13 +24,8 @@ public class Application { @OneToMany(mappedBy = "application") private List configurationFileList; - @ManyToMany - @JoinTable( - name = "administrator", - joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), - inverseJoinColumns = @JoinColumn(name = "application_id", referencedColumnName = "id") - ) - private List administratorList; + @OneToMany(mappedBy = "application") + private List administratorList; public String getId() { return id; @@ -64,11 +59,11 @@ public class Application { this.configurationFileList = configurationFileList; } - public List getAdministratorList() { + public List getAdministratorList() { return administratorList; } - public void setAdministratorList(List administratorList) { + public void setAdministratorList(List administratorList) { this.administratorList = administratorList; } } diff --git a/src/main/java/org/cerberus/entities/persistence/ApplicationRole.java b/src/main/java/org/cerberus/entities/persistence/ApplicationRole.java new file mode 100644 index 0000000..869de7b --- /dev/null +++ b/src/main/java/org/cerberus/entities/persistence/ApplicationRole.java @@ -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; + } +} diff --git a/src/main/java/org/cerberus/entities/persistence/User.java b/src/main/java/org/cerberus/entities/persistence/User.java index 5828f69..ad11508 100644 --- a/src/main/java/org/cerberus/entities/persistence/User.java +++ b/src/main/java/org/cerberus/entities/persistence/User.java @@ -25,17 +25,12 @@ public class User { @Column(nullable = false) private String password; - @Column(name = "inscription_date", nullable = false) + @Column(nullable = false) @Generated(GenerationTime.ALWAYS) private LocalDate inscriptionDate; - @ManyToMany - @JoinTable( - name = "administrator", - joinColumns = @JoinColumn(name = "application_id", referencedColumnName = "id"), - inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id") - ) - private List applicationList; + @OneToMany(mappedBy = "user") + private List applicationRoleList; public String getId() { return id; @@ -77,11 +72,11 @@ public class User { this.inscriptionDate = inscriptionDate; } - public List getApplicationList() { - return applicationList; + public List getApplicationRoleList() { + return applicationRoleList; } - public void setApplicationList(List applicationList) { - this.applicationList = applicationList; + public void setApplicationRoleList(List applicationRoleList) { + this.applicationRoleList = applicationRoleList; } } diff --git a/src/main/java/org/cerberus/repositories/UserRepository.java b/src/main/java/org/cerberus/repositories/UserRepository.java index fc568d4..5be3b1b 100644 --- a/src/main/java/org/cerberus/repositories/UserRepository.java +++ b/src/main/java/org/cerberus/repositories/UserRepository.java @@ -1,13 +1,18 @@ package org.cerberus.repositories; +import org.cerberus.entities.persistence.ApplicationRole; import org.cerberus.entities.persistence.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE u.email = :email") Optional findByEmail(@Param("email") String email); + + @Query("SELECT ar FROM ApplicationRole ar JOIN FETCH ar.application WHERE ar.user.email = :email") + List getApplicationRolesByEmail(@Param("email") String email); } diff --git a/src/main/java/org/cerberus/services/UserService.java b/src/main/java/org/cerberus/services/UserService.java index 42af00f..7358a8d 100644 --- a/src/main/java/org/cerberus/services/UserService.java +++ b/src/main/java/org/cerberus/services/UserService.java @@ -1,16 +1,19 @@ package org.cerberus.services; +import org.cerberus.constant.Role; import org.cerberus.core.config.security.CustomAuthenticationProvider; import org.cerberus.core.exceptions.BadRequestException; +import org.cerberus.entities.persistence.ApplicationRole; import org.cerberus.entities.persistence.User; import org.cerberus.repositories.UserRepository; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Service; -import javax.swing.text.html.Option; -import java.util.Collections; +import java.util.Collection; import java.util.Optional; +import java.util.stream.Collectors; @Service public class UserService { @@ -28,7 +31,7 @@ public class UserService { authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken( user.getEmail(), user.getPassword(), - Collections.singleton(new SimpleGrantedAuthority("APPLICATION_ADMIN")) + fetchGrantedAuthorities(user) )); } @@ -39,4 +42,12 @@ public class UserService { throw new BadRequestException("Credentials are incorrect."); } } + + Collection fetchGrantedAuthorities(User user) { + return userRepository.getApplicationRolesByEmail(user.getEmail()).stream() + .map(ApplicationRole::getRole) + .map(Role::name) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toSet()); + } } diff --git a/src/main/sql/1.0.0-SNAPSHOT b/src/main/sql/1.0.0-SNAPSHOT index e0b3402..ad3e63d 100644 --- a/src/main/sql/1.0.0-SNAPSHOT +++ b/src/main/sql/1.0.0-SNAPSHOT @@ -23,12 +23,13 @@ CREATE TABLE configuration_file ( ); CREATE INDEX configuration_file_application_id_idx ON configuration_file(application_id); -CREATE TABLE administrator ( +CREATE TABLE application_role ( user_id uuid NOT NULL, application_id uuid NOT NULL, - CONSTRAINT administrator_pk PRIMARY KEY (user_id, application_id), - CONSTRAINT administrator_user_id FOREIGN KEY (user_id) REFERENCES "user" (id), - CONSTRAINT administrator_application_id FOREIGN KEY (application_id) REFERENCES application (id) + role SMALLINT NOT NULL, + CONSTRAINT application_role_pk PRIMARY KEY (user_id, 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 administrator_application_id_idx ON administrator(application_id); \ No newline at end of file +CREATE INDEX application_role_user_id_idx ON application_role(user_id); +CREATE INDEX application_role_application_id_idx ON application_role(application_id); \ No newline at end of file