Securité & Cryptographie¶
Copy of
sumaris-pod/.agents/rules/security-and-crypto.md(rule written for AI coding agents, when implementing authentication, authorization, access control, or cryptographic operations). Do not edit here: runnpm run site:sync-rulesto update it.
Spring Security¶
- La sécurité des méthodes repose sur Spring Security et l'annotation
@Secured. - Le projet fournit des méta-annotations dans le package
net.sumaris.server.http.securitypour simplifier le contrôle d'accès :
| Annotation | Rôles autorisés | Usage |
|---|---|---|
@IsAdmin |
ROLE_ADMIN |
Réservé aux administrateurs |
@IsSupervisor |
ROLE_SUPERVISOR, ROLE_ADMIN |
Superviseurs et administrateurs |
@IsUser |
ROLE_USER, ROLE_SUPERVISOR, ROLE_ADMIN |
Tout utilisateur authentifié (hors guest) |
@IsGuest |
ROLE_GUEST, ROLE_USER, ROLE_SUPERVISOR, ROLE_ADMIN |
Tout utilisateur authentifié (y compris guest) |
- Applique ces annotations sur les méthodes de service ou les classes entières (
@Target({ METHOD, TYPE })). - Préfère toujours ces méta-annotations plutôt que
@Secureddirectement, pour garantir la cohérence des rôles. - Pour les vérifications programmatiques (dans les contrôleurs REST, etc.), utilise
AuthService.isLogin()etAuthService.hasAuthority().
Contrôle d'accès fin via DataAccessControlService¶
- Pour un contrôle d'accès plus granulaire (par programme de collecte, lieux, dates, etc.), utilise
DataAccessControlService(packagenet.sumaris.server.service.administration). - Ce service permet de vérifier et filtrer les droits d'un utilisateur selon :
- Programmes de collecte :
getAuthorizedProgramIds(),getAuthorizedProgramIdsByUserId(),getAllAuthorizedProgramIds(). - Lieux (locations) :
getAuthorizedLocationIds(),getAuthorizedLocationIdsByUserId(). - Données (lecture/écriture) :
checkCanRead(),checkCanWrite(),checkCanReadAll(),checkCanWriteAll()— vérifient les droits sur des objetsIRootDataVO. - Accès aux données d'autres utilisateurs :
canUserAccessNotSelfData(),canDepartmentAccessNotSelfData().
- Programmes de collecte :
- Utilise la constante
DataAccessControlService.NO_ACCESS_FAKE_IDSpour indiquer l'absence totale d'accès (valeur sentinelle-999). - Ce service est typiquement injecté dans les
GraphQLServiceet les contrôleurs REST pour appliquer les filtres d'accès avant de déléguer aux services métier. - Exemple d'utilisation dans un
GraphQLService:// Vérifier les droits en écriture dataAccessControlService.checkCanWrite(trip); // Filtrer les programmes autorisés Integer[] authorizedProgramIds = dataAccessControlService.getAuthorizedProgramIds(filter.getProgramIds()) .orElse(DataAccessControlService.NO_ACCESS_FAKE_IDS); filter.setProgramIds(authorizedProgramIds);
Crypto & keys¶
- Les termes
issuer/senderdésignent une clef publique (ED25519). - Pour le système lui‑même, utilise la valeur spéciale
SYSTEMplutôt qu’une clef dédiée. - Le serveur possède sa propre paire de clefs (pub/priv) pour signer des documents.
- Ne laisse jamais de chaîne codée en dur pour les entités système — utilise
SystemRecipientEnum. - Pour l’affichage des clé publique (pubkey) utilise
CryptoUtils.minifyPubkey()et résous les informations viaPersonServicepuisPersons.getDisplayName().