Domanda

Stavo per porre una domanda sull'accettabilità o meno della mia progettazione per alcune tabelle di database di utenti/ruoli, ma dopo alcune ricerche mi sono imbattuto in questa domanda:

Qual è il modo migliore per gestire più tipi di autorizzazione?

Sembra un approccio innovativo, quindi invece di una tabella di relazione molti-a-molti users_to_roles, ho più autorizzazioni definite come un singolo decimale (presumo tipo di dati int).Ciò significa che tutte le autorizzazioni per un singolo utente sono in una riga.Probabilmente non avrà senso finché non leggerai l'altra domanda e risposta

Non riesco a concentrarmi su questo.Qualcuno può spiegare il processo di conversione?Sembra "giusto", ma non capisco come convertire i ruoli in un decimale prima che entrino nel db e come vengono riconvertiti quando escono dal db.Sto usando Java, ma se lo spegnessi, sarebbe bello lo stesso.

Ecco la risposta originale nel caso in cui l'altra domanda venga eliminata:

"Personalmente, a volte utilizzo un'enumerazione contrassegnata di autorizzazioni.In questo modo puoi utilizzare operazioni AND, OR, NOT e XOR bit a bit sugli elementi dell'enumerazione.

[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}

Quindi, puoi combinare diverse autorizzazioni utilizzando l'operatore AND bit a bit.

Ad esempio, se un utente può visualizzare e modificare gli utenti, il risultato binario dell'operazione è 0000 0011 che convertito in decimale è 3.Puoi quindi memorizzare i permessi di un utente in una singola colonna del tuo DataBase (nel nostro caso sarebbe 3).

All'interno della tua applicazione, hai solo bisogno di un'altra operazione bit a bit (OR) per verificare se un utente ha o meno un permesso particolare."

È stato utile?

Soluzione

Si utilizzano operazioni bit per bit.Lo pseudo-codice sarebbe qualcosa del tipo:

bool HasPermission(User user, Permission permission) {
    return (user.Permission & permission) != 0;
}

void SetPermission(User user, Permission permission) {
    user.Permission |= permission;
}

void ClearPermission(User user, Permission permission) {
    user.Permission &= ~permission;
}

L'autorizzazione è il tipo enum definito nel tuo post, sebbene qualunque sia il tipo deve essere basato su un tipo simile a un numero intero.Lo stesso vale per il campo User.Permission.

Se questi operatori (&, |= e &=) non hanno senso per te, informati sulle operazioni bit a bit (AND bit a bit e OR bit a bit).

Altri suggerimenti

In realtà, questo è il modo in cui determiniamo l'autorità all'interno di un'applicazione web abbastanza grande di cui sono il DBA.

Se hai intenzione di fare qualcosa del genere, trarrai davvero beneficio dall'avere un file tabella dei numeri.Renderà i tuoi calcoli molto più veloci.

La configurazione di base include le seguenti tabelle:

  1. Gruppi: per fare molti a molti utenti e punti di sicurezza
  2. Punti di sicurezza - che contengono un valore per l'autorizzazione anonima e uno per gli utenti autenticati che non fanno parte di un gruppo separato
  3. Tabella di unione dei punti di sicurezza del gruppo
  4. Una speciale tabella di numeri BitMask che contiene voci per i valori ^2.Quindi c'è una voce per 2 (2) e due voci per tre (2 e 1).Questo ci evita di dover calcolare i valori ogni volta.

Per prima cosa determiniamo se l'utente ha effettuato l'accesso.Se non lo sono restituiamo l'autorizzazione anonima per il punto di sicurezza.

Successivamente determiniamo se l'utente è membro di uno qualsiasi dei gruppi associati al punto di sicurezza tramite un semplice EXISTS usare un JOIN.Se non lo sono, restituiamo il valore associato all'utente autenticato.La maggior parte dei valori predefiniti anonimi e autenticati sono impostati su 1 nel nostro sistema perché richiediamo che tu appartenga a gruppi specifici.

Nota: Se un utente anonimo non ottiene l'accesso, l'interfaccia lo reindirizza a una casella di accesso per consentirgli di accedere e riprovare.

Se l'utente È un membro di uno o più gruppi, quindi selezioniamo valori distinti dalla tabella BitMask per ciascuno dei valori definiti per i gruppi.Ad esempio, se appartenessi a tre gruppi e avessi un livello di autorizzazione pari a 8, uno a 12 e l'ultimo a 36, ​​la nostra selezione rispetto alla tabella Bit Mask restituirebbe rispettivamente 8, 8 e 4 e 4 e 32.Facendo una distinzione otteniamo i numeri 4, 8 e 32 che mascherano correttamente i bit a 101100.

Tale valore viene restituito come livello di autorizzazione dell'utente ed elaborato dal sito web.

Ha senso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top