Vous voulez regarder @PostFilter
et @PreFilter
. Ils fonctionnent à peu près comme @PreAuthorize
, mais peuvent supprimer les résultats des listes. Vous souhaitez également attribuer des rôles différents à vos utilisateurs, en supposant que vous ne le faites pas déjà.
Règles globales, comme administrateur pouvant tout voir, vous pouvez implémenter en écrivant une implémentation concrète de PermissionEvaluator
. Vous ajoutez ensuite cela au MethodSecurityExpressionHandler
Temps pour un exemple simple.
Ce code a été écrit dans un éditeur de texte. Il ne peut pas compiler et est seulement ici pour montrer les étapes nécessaires
Une très simpliste PermissionEvaluator
public class MyPermissionEvaluator implements PermissionEvaluator {
private static final SimpleGrantedAuthority AUTHORITY_ADMIN = new SimpleGrantedAuthority('admin');
public boolean hasPermission(final Authentication authentication, final Object classId, final Object permission) {
boolean permissionGranted = false;
// admin can do anything
if (authentication.getAuthorities().contains(AUTHORITY_ADMIN)) {
permissionGranted = true;
} else {
// Check if the logged in user is in the same class
}
return permissionGranted;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType,
Object permission) {
return false;
}
}
Ensuite, configurer la sécurité de la méthode
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Bean
public MethodSecurityExpressionHandler methodSecurityExpressionHandler(final PermissionEvaluator permissionEvaluator){
DefaultMethodSecurityExpressionHandler securityExpressionHandler = new DefaultMethodSecurityExpressionHandler();
securityExpressionHandler.setPermissionEvaluator(permissionEvaluator);
return securityExpressionHandler;
}
@Bean
public PermissionEvaluator permissionEvaluator() {
return new MyPermissionEvaluator();
}
}
Maintenant, nous pouvons utiliser notre filtre sur une méthode
@PostFilter("hasPermission(filterObject.getClassId(), 'READ')")
@Override
public List<Student> getAll() {
return querySomeStudents();
}
hasPermission
i n le @PostFilter
ACL appellera hasPermission
dans MyPermissionEvaluator
. filterObject
fait référence aux différents éléments de la liste. Où que vous code renvoie false, il supprimera l'élément de la liste.
merci pour votre attention! Je devrais créer beaucoup de RÔLE .... pour tous les étudiants !! Est-ce la meilleure solution !! ???? –