Structuring Access Control In Hierarchical Object Graph

6

Ho un'entità Folder che può essere moderata dagli utenti. Le cartelle possono contenere altre cartelle. Quindi potrei avere una struttura come questa:

Folder 1
    Folder 2
        Folder 3
    Folder 4

Devo decidere come implementare la moderazione per questa entità. Ho trovato due opzioni:

Opzione 1

Quando all'utente vengono assegnati i privilegi di moderazione per la Cartella 1, definire una relazione moderatore tra Cartella 1 e Utente 1. Nessun altro rapporto viene aggiunto al db.

Per determinare se l'utente può moderare la cartella 3, controllo e vedo se l'utente 1 è il moderatore di qualsiasi cartella principale.

Questo sembra alleviare la complessità della gestione degli aggiornamenti / delle entità spostate / aggiunte nella Cartella 1 dopo che la relazione è stata definita, e il ripristino della relazione significa che devo occuparmi solo di una entità.

Opzione 2

Quando all'utente vengono assegnati i privilegi di moderazione per la Cartella 1, definire una nuova relazione tra Utente 1 e Cartella 1, e tutte le entità figlio fino al più grande dei nipoti quando viene creata la relazione, e è mai stato rimosso, scorrere indietro nel grafico per rimuovere la relazione. Se aggiungo qualcosa nella Cartella 2 dopo che questa relazione è stata fatta, copio tutti i Moderatori nella nuova Entità.

Ma quando ho bisogno di mostrare solo le cartelle di primo livello che un utente sta moderando, ho bisogno di interrogare tutte le cartelle che hanno una cartella genitore che l'utente non modera, al contrario dell'opzione 1, dove ho appena interrogato qualsiasi elementi che l'utente sta moderando.

Pensieri

I penso si riduce a determinare se gli utenti interrogheranno per tutti gli oggetti genitore più di quanto faranno per interrogare gli oggetti figli ... se è così, allora l'opzione 1 sembra migliore. Ma non ne sono sicuro.

O si avvicinano meglio degli altri? Perché? O c'è un altro approccio che è migliore di entrambi? Sto usando Entity Framework nel caso abbia importanza.

    
posta SB2055 28.06.2013 - 06:26
fonte

4 risposte

2

L'opzione 1 è la soluzione più semplice, pulita e minima. Hai ragione che l'aggiornamento delle autorizzazioni richiede meno lavoro quando si spostano le cartelle e c'è meno lavoro nell'elaborare dove sono state effettivamente impostate le autorizzazioni di moderazione dell'utente. Quindi cercherei di implementare questo metodo. Se inizi ad aggiungere ulteriori record oltre a quelli introdotti dal super amministratore (come per l'opzione 2), inizi ad aggiungere rumore al tuo modello e poi devi filtrare nuovamente le informazioni reali.

Se stai memorizzando i tuoi dati in un database, dovresti cercare Nested Set Model . In questo modello, si aggiunge un campo "left" e "right" alla tabella delle cartelle e si danno a quei campi valori tali che i valori left e right di una cartella comprendono i valori left e right di tutte le cartelle discendenti (c'è un diagramma sul pagina di wikipedia che lo dimostra bene). Questo modello semplifica l'identificazione di tutti i bambini, i nipoti, ecc. Di una cartella e di tutti i genitori di una cartella, qualcosa che può essere piuttosto complesso con un semplice link id padre standard.

    
risposta data 06.07.2013 - 00:23
fonte
1

Ho creato un sistema con questo requisito e ho utilizzato un grafico di oggetto in memoria per rappresentare le cartelle e ho eseguito controlli di autorizzazione a tale scopo, piuttosto che dover estrarre i dati dal database.

link

    
risposta data 02.11.2016 - 22:29
fonte
0

Per l'opzione 2 potresti voler memorizzare se i privilegi sono ereditati dal genitore o meno. Altrimenti potresti perdere l'intento dell'utente quando cambi il genitore.

L'approccio migliore è mantenere logico. Recurse ai tuoi antenati per determinare i privilegi. A seconda di quanto sia profonda la tua gerarchia media, puoi farcela con un paio di domande, misurarla. È possibile ricorrere a Stored Procedure sul livello del database anche se si sta utilizzando SQL.

Solo se questo non è abbastanza veloce materializzerei i privilegi. Cercherò di farlo in un livello di cache di query e non nel database autorevole / normalizzato.

    
risposta data 04.07.2013 - 18:36
fonte
0

Se si utilizzerà SQL, è anche possibile utilizzare un "CTE ricorsivo" che è un tipo di sintassi SQL query che consente di eseguire query gerarchiche ricorsive come una singola query. Vedi questa risposta per maggiori dettagli: link

    
risposta data 03.11.2016 - 15:04
fonte