Add roles for relationship between user and applications.
This commit is contained in:
@@ -24,13 +24,8 @@ public class Application {
|
||||
@OneToMany(mappedBy = "application")
|
||||
private List<ConfigurationFile> configurationFileList;
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(
|
||||
name = "administrator",
|
||||
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
|
||||
inverseJoinColumns = @JoinColumn(name = "application_id", referencedColumnName = "id")
|
||||
)
|
||||
private List<User> administratorList;
|
||||
@OneToMany(mappedBy = "application")
|
||||
private List<ApplicationRole> administratorList;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
@@ -64,11 +59,11 @@ public class Application {
|
||||
this.configurationFileList = configurationFileList;
|
||||
}
|
||||
|
||||
public List<User> getAdministratorList() {
|
||||
public List<ApplicationRole> getAdministratorList() {
|
||||
return administratorList;
|
||||
}
|
||||
|
||||
public void setAdministratorList(List<User> administratorList) {
|
||||
public void setAdministratorList(List<ApplicationRole> 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)
|
||||
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<Application> applicationList;
|
||||
@OneToMany(mappedBy = "user")
|
||||
private List<ApplicationRole> applicationRoleList;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
@@ -77,11 +72,11 @@ public class User {
|
||||
this.inscriptionDate = inscriptionDate;
|
||||
}
|
||||
|
||||
public List<Application> getApplicationList() {
|
||||
return applicationList;
|
||||
public List<ApplicationRole> getApplicationRoleList() {
|
||||
return applicationRoleList;
|
||||
}
|
||||
|
||||
public void setApplicationList(List<Application> applicationList) {
|
||||
this.applicationList = applicationList;
|
||||
public void setApplicationRoleList(List<ApplicationRole> applicationRoleList) {
|
||||
this.applicationRoleList = applicationRoleList;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<User, String> {
|
||||
@Query("SELECT u FROM User u WHERE u.email = :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;
|
||||
|
||||
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<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 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);
|
||||
CREATE INDEX application_role_user_id_idx ON application_role(user_id);
|
||||
CREATE INDEX application_role_application_id_idx ON application_role(application_id);
|
||||
Reference in New Issue
Block a user