Controllo delle modifiche dell'utente dell'applicazione Web

1

Ho un'applicazione web scritta in Java, Oracle e AngularJS. Voglio salvare il log in nel database quando l'utente cambia, crea o aggiorna qualcosa.

Ci sono due modi per implementarlo:

1. Controllo delle tabelle tramite trigger

Contro: a livello di database Non ho informazioni utente che apportano modifiche, quindi devo salvare userName in ogni tabella, apporto qualsiasi modifica.

Ad esempio: la mia tabella sarà simile a questa:

my_table {
     field_1, 
     field_2, 
     ...,
     userName
)

2. Aggiunta della funzionalità di registrazione degli eventi nelle funzioni API dell'applicazione Web

Ad esempio, quando l'utente cambia i dati devo chiamare entrambe le funzioni: changeObject e AuditUserChange .

Oltre a questo, devo aggiungere il trigger sulla tabella per salvare il log di controllo quando qualcuno (specialista del supporto) apporta modifiche direttamente nelle tabelle del database.

Quale strategia dovrei usare? Quale opzione è migliore?

    
posta mariami 19.09.2017 - 12:35
fonte

2 risposte

2

Domanda: mai modifica questi dati per mezzo di diversi da l'applicazione Web? (Hai mai avuto bisogno di "sistemare" i dati?).

Se la risposta è "Sì", utilizzare i trigger.

Il nome utente deve essere accessibile al database: identificativo_utente di oracle è una buona opzione, ma devi codificare l'applicazione client per passarla.

Quindi potresti creare una tabella che duplichi in gran parte la tabella controllata, in questo modo:

create table main_table 
( field1 varchar2( 1 char ) 
, ... 
, field9 varchar2( 9 char ) 
); 

create table main_audit
( username varchar2( 256 ) 
, change_date date 
, change_type varchar2( 1 char ) 
, field1 varchar2( 1 char ) 
, ... 
, field9 varchar2( 9 char ) 
); 

Il trigger quindi copia i valori da una tabella all'altra, usando le vecchie e nuove tabelle pseudo. (Il tipo di modifica potrebbe avere valori per Insert e Elimina e, per gli aggiornamenti, due valori che rappresentano le immagini "prima" e "dopo" del record (quali valori erano è spesso importanti quanto quelli che sono ora ).

Una sequenza di modifiche potrebbe essere simile a questa:

select * from maim_audit ; 
+----------+---------------------+-------------+---------+--------+ 
| username | change_date         | change_type | field1  | field9 | 
+----------+---------------------+-------------+---------+--------+ 
| bob      | 2017-09-19 08:00:06 | 1 (Insert)  | BMW     | 325    | 
| arnold   | 2017-09-19 10:53:05 | 2 (Before)  | BMW     | 118    | 
| arnold   | 2017-09-19 10:53:05 | 3 (After)   | Peugeot | 107    | 
| jeff     | 2017-09-19 11:15:00 | 4 (Delete)  | Peugeot | 107    | 
+----------+---------------------+-------------+---------+--------+ 
    
risposta data 19.09.2017 - 12:57
fonte
0

Bene, inizierò col dire che il contesto è importante. Non hai detto se la tua applicazione è intranet o internet, né quanto è grande la tua popolazione di utenti web.

In un'applicazione basata su Intranet, un'opzione praticabile potrebbe essere quella di utilizzare l'identità del proprio utente Web come utente DB per ogni richiesta e effettuare tutte le operazioni di accesso al database. Questo però si ridimensiona solo se stai usando una sorta di single sign on o un server di autenticazione centrale come Active Directory, comunque.

Se questa non è un'opzione, probabilmente inizierò registrando l'attività degli utenti Web tramite i registri delle applicazioni e quindi configurando la funzionalità di controllo di Oracle ( link ), in quanto probabilmente funzionerà meglio e in modo più affidabile rispetto ai trigger personalizzati.

Tieni presente che, a seconda del materiale web Java che stai utilizzando, ci sono modi per rendere la registrazione più semplice che dover ricordare ogni volta che scrivi una funzione per aggiungere una chiamata alla tua classe di Audit. Cerca nella programmazione orientata agli aspetti o forse se il tuo framework ha un concetto della pipeline della richiesta, registra semplicemente tutte le richieste web con le informazioni utente che ti servono.

Infine, cercherò qualche aggregazione dei registri come ElasticStack o Splunk per ottenere tutti i registri di controllo in un'unica posizione / formato in modo che sia più facile identificare attività dannose piuttosto che dover cacciare.

    
risposta data 19.09.2017 - 12:56
fonte

Leggi altre domande sui tag