Add roles for relationship between user and applications.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
Reference in New Issue
Block a user