Accueil > Non classé > De l’audit avec hibernate

De l’audit avec hibernate

Hello my dear students*,

Pouvez-vous me faire un rapport sur tous les ajouts et les modifications qui ont été faits sur la table des factures en production depuis 5 ans ?

Hibernate a vraiment pensé à tout, aujourd’hui nous allons parler de l’interface Interceptor et de son utilisation dans le but de faciliter l’audit du système d’information (ici la base de données).

L’interceptor hibernate

Cette interface fournit des méthodes qui interceptent différents événements de la session comme la suppression, l’ajout ou la modification de données.

Vous pouvez implémenter Interceptor directement, ou mieux : étendre EmptyInterceptor et n’en surcharger que les méthodes qui vous intéressent. Voici un exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * Audite l'insertion et la mise à jour des entités implémentant l'interface {@link ExcilysAuditable}.
 * <p>
 *
 * Le choix de la méthode d'audit est laissé à la discretion du codeur.
 *
 */

public class ExcilysAuditLogInterceptor extends EmptyInterceptor {

    public boolean onSave(Object entity,
                         Serializable id,
                         Object[] state,
                         String[] propertyNames,
                         Type[] types)
            throws CallbackException {

        if (entity instanceof ExcilysAuditable) {
            // loguez de la manière qui vous plaira que l'entité à été insérée
        }

        return false; // parce que l'on a pas modifié l'entité impliquée dans le callback
    }

    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types)
            throws CallbackException {
           
        if (entity instanceof ExcilysAuditable) {
            // loguez de la manière qui vous plaira que l'entité à été modifiée
        }
       
        return false; // parce que l'on a pas modifié l'entité impliquée dans le callback
    }

}

Attention cependant, auditer les insertions et les mises à jour peut ralentir votre application !

Pour rendre effective l’utilisation par Hibernate de votre Interceptor, passez-le en paramètre lors de la création de la session (sf correspond à la SessionFactory) :

1
Session session = sf.openSession( new ExcilysAuditLogInterceptor() );

Interceptors versus Triggers

Pour se rappeler de ce qu’est un Trigger SGBD, lire cet article !

Les triggers

  • sont rapides
  • seront aussi appelés si vous faites des insert en base directement (on est donc sûr d’auditer tout changement)

Les Interceptors

  • ne dépendent pas du type de base de données (par exemple Access ne gère pas les triggers)
  • permettent de récupérer des données système comme la locale ou l’utilisateur de la session

Conclusion

Voilà, encore une façon supplémentaire de tracer ce que font vos utilisateurs. N’oubliez pas que les erreurs sont plus faciles à mettre sur le dos d’un autre quand il existe des preuves qui vont dans votre sens ;-).

Pouvez-vous me faire un rapport sur tous les ajouts et les modifications qui ont été faits sur la table des factures en production depuis 5 ans ?

Mais bien sûr je n’ai qu’à faire haut haut bas bas gauche droite gauche droite b a, et le tour est joué ! Et en plus, je vous ai fait un café !

Bravo, j’ai pu démasquer des centaines de fraudes grâce à vous ! Vous êtes trop puissant Black Dynamite !

Cuz there aint no hope for dudes who deal dope!

* référence à Marina Orlova, qui m’a appris que l’etymologie pouvait être sexy.

Share
  1. regis
    16/06/2010 à 18:18 | #1

    A ne pas oublier

    Envers: Easy Entity Auditing
    http://www.jboss.org/envers/

    Permettant de faire laudit plus pousse (versionning) sur les entity simplement !!!
    Et fonctionne tres bien avec hibernate.

    Un petit article bien sympa
    => http://www.touilleur-express.fr/2009/07/04/jazoon-2009-hibernate-envers/

  2. Alexis
    17/06/2010 à 07:23 | #2

    Envers ++

    Pour reprendre Regis, il fonctionne tellement bien avec hibernate qu’il a été inclus dans celui-ci depuis la version 3.5.

  1. 16/06/2010 à 19:18 | #1
  2. 09/09/2015 à 15:01 | #2