Skip to content

Commit 5cd7499

Browse files
feat: cloisonnement des académies par groupe de sources
1 parent c47d22c commit 5cd7499

10 files changed

Lines changed: 114 additions & 71 deletions

File tree

‎src/main/java/fr/recia/manager/configuration/SecurityConfiguration.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,9 @@ public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> customU
203203
} else {
204204
log.warn("No groups for user {} !", username);
205205
}
206-
log.trace("User {} logged in with rights {} and {}", username, rightsForEtabs, globalRights);
207-
return new AppUser(username, "", new ArrayList<>(), rightsForEtabs, globalRights);
206+
final String source = ((String) attributes.get(appProperties.getCas().getSourceAttribute())).split("\\$")[0];
207+
log.debug("User {} logged in with rights {} and {} and source {}", username, rightsForEtabs, globalRights, source);
208+
return new AppUser(username, "", new ArrayList<>(), rightsForEtabs, globalRights, source);
208209
};
209210
}
210211

‎src/main/java/fr/recia/manager/configuration/bean/CASProperties.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ public class CASProperties {
3030
private String casProviderKey;
3131
private String casTicketCallback;
3232
private Set<String> authorizedDomains;
33+
private String sourceAttribute;
3334

3435
}

‎src/main/java/fr/recia/manager/configuration/bean/CustomConfigProperties.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ public class CustomConfigProperties {
4444
private List<FonctionsProperties> fonctions;
4545
private Map<String, Set<String>> adminFonctionsBySource;
4646
private List<LoginOfficeProperties> loginOffices;
47+
private List<PartitionedSourcesProperties> partitionedSources;
48+
49+
@Data
50+
public static class PartitionedSourcesProperties {
51+
private String name;
52+
private Set<String> sources;
53+
}
4754

4855
@Data
4956
public static class AlertProperties {

‎src/main/java/fr/recia/manager/db/repositories/personne/APersonneRepository.java‎

Lines changed: 44 additions & 28 deletions
Large diffs are not rendered by default.

‎src/main/java/fr/recia/manager/security/AppUser.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ public class AppUser extends User {
3131

3232
private Map<AppRole, Set<String>> rightsForEtabs;
3333
private Set<AppRole> globalRights;
34+
private String source;
3435

3536
public AppUser(String username, String password, Collection<? extends GrantedAuthority> authorities,
36-
Map<AppRole, Set<String>> rightsForEtabs, Set<AppRole> globalRights) {
37+
Map<AppRole, Set<String>> rightsForEtabs, Set<AppRole> globalRights, String source) {
3738
super(username, password, authorities);
3839
this.rightsForEtabs = rightsForEtabs;
3940
this.globalRights = globalRights;
41+
this.source = source;
4042
}
4143

4244
}

‎src/main/java/fr/recia/manager/services/db/FonctionService.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ public List<DisciplineDto> getDisciplines(String source) {
125125
}
126126

127127
@Cacheable(value = "personnesWithoutFunctions")
128-
public List<DatabasePersonneDto> getPersonnesWithoutFunctions(Long structureId, boolean showUid) {
128+
public List<DatabasePersonneDto> getPersonnesWithoutFunctions(Long structureId, boolean showUid, Set<String> sources) {
129129
log.trace("getPersonnesWithoutFunctions for {}", structureId);
130130
final List<Long> personnesIds = fonctionRepository.findPersonnesWithoutFunctions(structureId);
131131
if (showUid) {
132-
return aPersonneRepository.findByPersonneIdsWithUid(new HashSet<>(personnesIds));
132+
return aPersonneRepository.findByPersonneIdsWithUid(new HashSet<>(personnesIds), sources);
133133
} else {
134-
return aPersonneRepository.findByPersonneIdsWithoutUid(new HashSet<>(personnesIds));
134+
return aPersonneRepository.findByPersonneIdsWithoutUid(new HashSet<>(personnesIds), sources);
135135
}
136136
}
137137

‎src/main/java/fr/recia/manager/services/db/PersonneService.java‎

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,55 +82,55 @@ public class PersonneService {
8282
private PasswordGenerator passwordGenerator;
8383

8484

85-
public List<DatabasePersonneDto> searchPersonne(String name, boolean admin) {
86-
return admin ? aPersonneRepository.findByNameLikeAdmin(name) : aPersonneRepository.findByNameLike(name);
85+
public List<DatabasePersonneDto> searchPersonne(String name, boolean admin, Set<String> sources) {
86+
return admin ? aPersonneRepository.findByNameLikeAdmin(name, sources) : aPersonneRepository.findByNameLike(name, sources);
8787
}
8888

89-
public List<DatabasePersonneDto> searchPersonneInStaffCategories(String name, boolean admin) {
90-
return admin ? aPersonneRepository.findByNameLikeAdminInStaffCategories(name) : aPersonneRepository.findByNameLikeInStaffCategories(name);
89+
public List<DatabasePersonneDto> searchPersonneInStaffCategories(String name, boolean admin, Set<String> sources) {
90+
return admin ? aPersonneRepository.findByNameLikeAdminInStaffCategories(name, sources) : aPersonneRepository.findByNameLikeInStaffCategories(name, sources);
9191
}
9292

93-
public List<DatabasePersonneDto> searchPersonneInEtab(String name, Set<Long> structureIds, boolean admin) {
94-
return admin ? aPersonneRepository.findByNameLikeAdminInEtab(name, structureIds) : aPersonneRepository.findByNameLikeInEtab(name, structureIds);
93+
public List<DatabasePersonneDto> searchPersonneInEtab(String name, Set<Long> structureIds, boolean admin, Set<String> sources) {
94+
return admin ? aPersonneRepository.findByNameLikeAdminInEtab(name, structureIds, sources) : aPersonneRepository.findByNameLikeInEtab(name, structureIds, sources);
9595
}
9696

97-
public List<DatabasePersonneDto> searchPersonneInEtabInStaffCategories(String name, Set<Long> structureIds, boolean admin) {
98-
return admin ? aPersonneRepository.findByNameLikeAdminInEtabInStaffCategories(name, structureIds) : aPersonneRepository.findByNameLikeInEtabInStaffCategories(name, structureIds);
97+
public List<DatabasePersonneDto> searchPersonneInEtabInStaffCategories(String name, Set<Long> structureIds, boolean admin, Set<String> sources) {
98+
return admin ? aPersonneRepository.findByNameLikeAdminInEtabInStaffCategories(name, structureIds, sources) : aPersonneRepository.findByNameLikeInEtabInStaffCategories(name, structureIds, sources);
9999
}
100100

101-
public List<DatabasePersonneDto> searchPersonneInEtabBySiren(String name, Set<String> sirens, boolean admin) {
102-
return admin ? aPersonneRepository.findByNameLikeAdminInEtabBySiren(name, sirens) : aPersonneRepository.findByNameLikeInEtabBySiren(name, sirens);
101+
public List<DatabasePersonneDto> searchPersonneInEtabBySiren(String name, Set<String> sirens, boolean admin, Set<String> sources) {
102+
return admin ? aPersonneRepository.findByNameLikeAdminInEtabBySiren(name, sirens, sources) : aPersonneRepository.findByNameLikeInEtabBySiren(name, sirens, sources);
103103
}
104104

105-
public List<DatabasePersonneDto> searchPersonneInEtabBySirenInStaffCategories(String name, Set<String> sirens, boolean admin) {
106-
return admin ? aPersonneRepository.findByNameLikeAdminInEtabBySirenInStaffCategories(name, sirens) : aPersonneRepository.findByNameLikeInEtabBySirenInStaffCategories(name, sirens);
105+
public List<DatabasePersonneDto> searchPersonneInEtabBySirenInStaffCategories(String name, Set<String> sirens, boolean admin, Set<String> sources) {
106+
return admin ? aPersonneRepository.findByNameLikeAdminInEtabBySirenInStaffCategories(name, sirens, sources) : aPersonneRepository.findByNameLikeInEtabBySirenInStaffCategories(name, sirens, sources);
107107
}
108108

109-
public List<DatabasePersonneDto> searchPersonneNotInEtab(String name, Set<Long> structureIds, boolean admin) {
110-
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtab(name, structureIds) : aPersonneRepository.findByNameLikeNotInEtab(name, structureIds);
109+
public List<DatabasePersonneDto> searchPersonneNotInEtab(String name, Set<Long> structureIds, boolean admin, Set<String> sources) {
110+
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtab(name, structureIds, sources) : aPersonneRepository.findByNameLikeNotInEtab(name, structureIds, sources);
111111
}
112112

113-
public List<DatabasePersonneDto> searchPersonneNotInEtabInStaffCategories(String name, Set<Long> structureIds, boolean admin) {
114-
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabInStaffCategories(name, structureIds) : aPersonneRepository.findByNameLikeNotInEtabInStaffCategories(name, structureIds);
113+
public List<DatabasePersonneDto> searchPersonneNotInEtabInStaffCategories(String name, Set<Long> structureIds, boolean admin, Set<String> sources) {
114+
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabInStaffCategories(name, structureIds, sources) : aPersonneRepository.findByNameLikeNotInEtabInStaffCategories(name, structureIds, sources);
115115
}
116116

117-
public List<DatabasePersonneDto> searchPersonneNotInEtabButInSiren(String name, Set<Long> structureIds, Set<String> sirens, boolean admin) {
118-
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabButInSiren(name, structureIds, sirens) : aPersonneRepository.findByNameLikeNotInEtabButInSiren(name, structureIds, sirens);
117+
public List<DatabasePersonneDto> searchPersonneNotInEtabButInSiren(String name, Set<Long> structureIds, Set<String> sirens, boolean admin, Set<String> sources) {
118+
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabButInSiren(name, structureIds, sirens, sources) : aPersonneRepository.findByNameLikeNotInEtabButInSiren(name, structureIds, sirens, sources);
119119
}
120120

121-
public List<DatabasePersonneDto> searchPersonneNotInEtabButInSirenInStaffCategories(String name, Set<Long> structureIds, Set<String> sirens, boolean admin) {
122-
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabButInSirenInStaffCategories(name, structureIds, sirens) : aPersonneRepository.findByNameLikeNotInEtabButInSirenInStaffCategories(name, structureIds, sirens);
121+
public List<DatabasePersonneDto> searchPersonneNotInEtabButInSirenInStaffCategories(String name, Set<Long> structureIds, Set<String> sirens, boolean admin, Set<String> sources) {
122+
return admin ? aPersonneRepository.findByNameLikeAdminNotInEtabButInSirenInStaffCategories(name, structureIds, sirens, sources) : aPersonneRepository.findByNameLikeNotInEtabButInSirenInStaffCategories(name, structureIds, sirens, sources);
123123
}
124124

125125
@Cacheable(value = "personnesByEtablissement")
126-
public List<DatabasePersonneDto> getPersonnes(Long structureId, boolean showUid) {
126+
public List<DatabasePersonneDto> getPersonnes(Long structureId, boolean showUid, Set<String> sources) {
127127
log.trace("getPersonnes for {}", structureId);
128128
final List<Long> personnesIds = aPersonneAStructureRepository.findPersonneByStructureId(structureId);
129129
if (personnesIds.isEmpty()) return List.of();
130130
if (showUid) {
131-
return aPersonneRepository.findByPersonneIdsWithUid(new HashSet<>(personnesIds));
131+
return aPersonneRepository.findByPersonneIdsWithUid(new HashSet<>(personnesIds), sources);
132132
} else {
133-
return aPersonneRepository.findByPersonneIdsWithoutUid(new HashSet<>(personnesIds));
133+
return aPersonneRepository.findByPersonneIdsWithoutUid(new HashSet<>(personnesIds), sources);
134134
}
135135
}
136136

‎src/main/java/fr/recia/manager/web/rest/PersonneController.java‎

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
import fr.recia.manager.audit.AuditEvent;
2323
import fr.recia.manager.audit.AuditService;
2424
import fr.recia.manager.audit.EventType;
25+
import fr.recia.manager.configuration.AppProperties;
26+
import fr.recia.manager.configuration.bean.CustomConfigProperties;
2527
import fr.recia.manager.db.dto.personne.DatabasePersonneDto;
26-
import fr.recia.manager.db.entities.education.Enseignement;
2728
import fr.recia.manager.db.entities.personne.APersonne;
2829
import fr.recia.manager.db.entities.structure.AStructure;
2930
import fr.recia.manager.db.enums.Etat;
@@ -81,6 +82,8 @@ public class PersonneController {
8182
private StructureService structureService;
8283
@Autowired
8384
private AuditService auditService;
85+
@Autowired
86+
private AppProperties appProperties;
8487

8588
@GetMapping
8689
public ResponseEntity<List<SearchedPersonneDto>> searchPersonne(@AuthenticationPrincipal AppUser principal,
@@ -93,15 +96,23 @@ public ResponseEntity<List<SearchedPersonneDto>> searchPersonne(@AuthenticationP
9396
Set<String> allowedSiren = principal.getRightsForEtabs().get(AppRole.READ_GLC);
9497
boolean canSearchByUid = principal.getGlobalRights().contains(AppRole.SEARCH_UID);
9598

99+
Set<String> sources = new HashSet<>();
100+
// TODO : Cloisonnement aux sources de l'académie de l'utilisateur
101+
for(CustomConfigProperties.PartitionedSourcesProperties partitionedSources : appProperties.getCustomConfig().getPartitionedSources()){
102+
if(partitionedSources.getSources().contains(principal.getSource())){
103+
sources = partitionedSources.getSources();
104+
}
105+
}
106+
96107
// Cas de la recherche dans un établissement
97108
if(etabId != null){
98109
AStructure aStructure = structureService.getStructureDBFromId(etabId);
99110
if(allowedSiren.contains(aStructure.getSiren())){
100111
// Ici pas besoin de revérifier les droits car ils sont déjà véirifiés implicitement comme on recherche uniquement dans l'établissement
101112
if(staff){
102-
personnes = personneService.searchPersonneInEtabInStaffCategories(name, Set.of(etabId), canSearchByUid);
113+
personnes = personneService.searchPersonneInEtabInStaffCategories(name, Set.of(etabId), canSearchByUid, sources);
103114
} else {
104-
personnes = personneService.searchPersonneInEtab(name, Set.of(etabId), canSearchByUid);
115+
personnes = personneService.searchPersonneInEtab(name, Set.of(etabId), canSearchByUid, sources);
105116
}
106117
} else {
107118
log.warn("User {} is not authorized to view etab {}", principal.getUsername(), etabId);
@@ -114,15 +125,15 @@ else if(notInEtabId != null){
114125
// recherche hors d'un établissement sans vérifier les droits = recherche utilisée pour le rattachement
115126
if(!checkRights){
116127
if(staff){
117-
personnes = personneService.searchPersonneNotInEtabInStaffCategories(name, Set.of(notInEtabId), canSearchByUid);
128+
personnes = personneService.searchPersonneNotInEtabInStaffCategories(name, Set.of(notInEtabId), canSearchByUid, sources);
118129
} else {
119-
personnes = personneService.searchPersonneNotInEtab(name, Set.of(notInEtabId), canSearchByUid);
130+
personnes = personneService.searchPersonneNotInEtab(name, Set.of(notInEtabId), canSearchByUid, sources);
120131
}
121132
} else {
122133
if(staff){
123-
personnes = personneService.searchPersonneNotInEtabButInSirenInStaffCategories(name, Set.of(notInEtabId), allowedSiren, canSearchByUid);
134+
personnes = personneService.searchPersonneNotInEtabButInSirenInStaffCategories(name, Set.of(notInEtabId), allowedSiren, canSearchByUid, sources);
124135
} else {
125-
personnes = personneService.searchPersonneNotInEtabButInSiren(name, Set.of(notInEtabId), allowedSiren, canSearchByUid);
136+
personnes = personneService.searchPersonneNotInEtabButInSiren(name, Set.of(notInEtabId), allowedSiren, canSearchByUid, sources);
126137
}
127138
}
128139
}
@@ -131,16 +142,16 @@ else if(notInEtabId != null){
131142
else {
132143
if(!checkRights){
133144
if(staff){
134-
personnes = personneService.searchPersonneInStaffCategories(name, canSearchByUid);
145+
personnes = personneService.searchPersonneInStaffCategories(name, canSearchByUid, sources);
135146
} else {
136-
personnes = personneService.searchPersonne(name, canSearchByUid);
147+
personnes = personneService.searchPersonne(name, canSearchByUid, sources);
137148
}
138149
} else {
139150
// On ne cherche que les personnes dans les sirens autorisés
140151
if(staff){
141-
personnes = personneService.searchPersonneInEtabBySirenInStaffCategories(name, allowedSiren, canSearchByUid);
152+
personnes = personneService.searchPersonneInEtabBySirenInStaffCategories(name, allowedSiren, canSearchByUid, sources);
142153
} else {
143-
personnes = personneService.searchPersonneInEtabBySiren(name, allowedSiren, canSearchByUid);
154+
personnes = personneService.searchPersonneInEtabBySiren(name, allowedSiren, canSearchByUid, sources);
144155
}
145156
}
146157
}
@@ -175,7 +186,6 @@ public ResponseEntity<MappingJacksonValue> exportPersonnes(@AuthenticationPrinci
175186

176187
@GetMapping(value = "/{id}")
177188
public ResponseEntity<PersonneDetailDto> getPersonne(@AuthenticationPrincipal AppUser principal, @PathVariable Long id) {
178-
// TODO : la route est aussi appellée lors du rattachement sauf qu'on a pas forcément les droits sur l'étab duquel la personne est de base
179189
APersonne personne = personneService.getPersonne(id);
180190
if (personne == null) {
181191
return new ResponseEntity<>(HttpStatus.NOT_FOUND);

‎src/main/java/fr/recia/manager/web/rest/StructureController.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ public ResponseEntity<StructureDto> getEtablissement(@AuthenticationPrincipal Ap
166166
boolean showUid = principal.getRightsForEtabs().get(AppRole.VIEW_UID).contains(etablissement.getSiren());
167167

168168
// Récupération de la liste des personnes depuis la database
169-
List<DatabasePersonneDto> etabPersonnes = personneService.getPersonnes(id, showUid);
170-
List<DatabasePersonneDto> withoutFunction = fonctionService.getPersonnesWithoutFunctions(id, showUid);
169+
List<DatabasePersonneDto> etabPersonnes = personneService.getPersonnes(id, showUid, Set.of(etablissement.getSource()));
170+
List<DatabasePersonneDto> withoutFunction = fonctionService.getPersonnesWithoutFunctions(id, showUid, Set.of(etablissement.getSource()));
171171

172172
// Liste des personnes de l'établissement
173173
etablissement.setListePersonnes(etabPersonnes, appProperties.getCustomConfig().getLoginOffices());

‎src/main/resources/config/application-dev.example.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ app:
7070
cas-ticket-callback: /login/cas
7171
authorized-domains:
7272
- http://HOST
73+
source-attribute:
7374

7475
cors:
7576
allowed-origins:
@@ -170,6 +171,11 @@ app:
170171
template-api-path: ''
171172

172173
custom-config:
174+
partitionedSources:
175+
- name: ''
176+
sources:
177+
-
178+
173179
pronote-group-regex:
174180
suppress-days:
175181

0 commit comments

Comments
 (0)