In che modo le applicazioni web ad alte prestazioni controllano l'autorizzazione per i loro contenuti?

8

Quindi, credo di capire la logica dietro gli standard di autorizzazione come OAuth. Il token OAuth contiene informazioni sull'utente (nome, ruolo, ecc.), Che posso usare per proteggere la mia applicazione .

Riguarda l'ultima parte della frase precedente che ho una domanda. Diciamo che ho un'app Web con 1000 articoli, come faccio a verificare se un utente specifico (basato sul suo token OAuth) ha accesso a un determinato articolo? Vedo diverse opzioni:

  1. Conservo tutti gli ID degli articoli che l'utente può vedere nel token OAuth (ad esempio ID1, ID2, ID3, ecc.);
  2. Al contrario, posso anche memorizzare gli utenti che possono accedere all'articolo (ad esempio, l'articolo 1 può essere letto dagli utenti 1,2,3). Questo è come un ACL;
  3. Per ogni articolo, memorizzo quali ruoli possono accedere a tale articolo (ad esempio, l'articolo 1 può essere letto per ruolo: lettore). Questo è come RBAC;
  4. Non proteggere affatto i tuoi contenuti, proprio come sembra che Facebook faccia (sebbene assicurati, ma controllano semplicemente la tua lista di amici prima di darti l'URL diretto alla risorsa).

Per chiarire: non sto cercando una risposta che spieghi che puoi mettere delle affermazioni nel token stesso, in modo da non dover colpire il db per recuperare le tue affermazioni (stateless). Sto cercando modi in cui il back-end dell'applicazione utilizza queste affermazioni per decidere se è concesso o meno l'accesso a un determinato elemento di contenuto.

  • L'opzione 1 sembra una cattiva pratica, poiché i token diventeranno infinitamente grandi per i grandi fornitori.
  • Se i provider di grandi dimensioni utilizzano l'opzione 2 o 3, avranno una quantità enorme di hit del database (controlla se l'articolo è accessibile all'utente), il che non può essere positivo per le prestazioni. Questo aumento delle prestazioni è uno dei motivi per cui Facebook e Twitters utilizzano un'autorizzazione stateless, anziché un'autorizzazione statutaria. Suppongo che questa penalizzazione delle prestazioni a livello di contenuto sia un ostacolo all'utilizzo delle opzioni 2 o 3.
  • Quindi, è l'unica opzione valida per andare con 4?

Un'ultima opzione che vedo è quella di utilizzare l'opzione 3, combinata con il caching pesante. Poiché le autorizzazioni per i contenuti non sono effimere quanto i diritti degli utenti, questa è l'opzione che vorrei fare. Ma è così che i grandi fornitori (Google, Twitter, Dropbox, ecc.) Lo fanno? E come viene implementato praticamente?

Aggiornamento

Qualcuno mi ha parlato di matrice dei permessi di Spring che puoi mettere in memoria, ma non sono sicuro se questa sarebbe la strada da percorrere ..

    
posta Michael 15.10.2015 - 14:29
fonte

2 risposte

3

Ad ogni articolo è associato un oggetto di autorizzazione associato. Quell'oggetto di autorizzazioni descrive il codice da valutare e tutti i possibili parametri. La maggior parte dei contesti è abbastanza normalizzata, come in Facebook dove il contesto potrebbe essere amici.

Quindi, il controllo dello spettatore valuta le sue regole allegate: se sei un amico, ha successo. È un'operazione piuttosto veloce. Puoi andare oltre, allegando dati specifici al controllo (condivido qualcosa con tutti i miei amici tranne Eve, o con un elenco specifico). Puoi anche impostare regole per un visualizzatore: un editor potrebbe avere un controller della privacy collegato al contesto che restituisce true per tutte le chiamate.

Ci sono due buoni esempi in cima alla mia testa che possono vedere alcuni dei meccanismi di. La prima è costituita dalle autorizzazioni Amazon AWS: le policy sono allegate sia agli utenti che agli oggetti e descrivono le azioni consentite su AWS. Nel caso di AWS, la regola inizia con una negazione implicita. Vengono valutate tutte le regole associate all'utente e al servizio e la logica booleana è if permitted and not explicitly_denied . Controlla il simulatore della politica IAM per una visualizzazione grafica di come valutare le cose.

L'altra vista è servizi PAM per Unix , che ti consente di scrivere qualsiasi codice desideri prendendo in considerazione l'utente e contrassegnando il risultato come required , sufficient o alcune altre opzioni.

Per il tuo caso specifico, ognuno di essi potrebbe impostare una valutazione per RBAC, una valutazione per specifico

A proposito, sia Facebook che Twitter usano un'autorizzazione statutaria. Almeno nel caso di Facebook per quanto riguarda le immagini, l'effettivo accesso a un'immagine memorizzata nella cache non viene controllato per consentire la memorizzazione nella cache remota, ma è durante la generazione della pagina. È una chiamata al database ogni volta. Un tipico caricamento di pagina su Facebook può generare oltre 100.000 chiamate al database. Semplici archivi di tipo KV, memcache e un strong parallelismo aiutano davvero a farlo funzionare.

    
risposta data 19.10.2015 - 07:09
fonte
0

Alcuni suggerimenti:

È necessario memorizzare il token oauth, ottenuto dall'utente connesso, da qualche parte. Con ogni richiesta puoi quindi verificare questo token. Questo crea un numero enorme di richieste e può rallentare il tuo servizio. Quello che puoi fare è implementare il tuo token basato su questo token oauth che salvi in un DB e, ad esempio, memorizzare questo lato del client token in un cookie o ID di sessione.

Sul back-end il token deve essere convalidato ad ogni richiesta. Come potresti aver visto google, airbnb e così via, basta caricare un layout di base e il resto è caricato con richieste Ajax che rendono l'intera pagina più rapida. Quindi in ogni richiesta devi aggiungere il tuo token corrente e naturalmente convalidarlo sul lato server.

Tenendo presente questa idea, puoi pubblicare siti che richiedono un accesso molto veloce in quanto sono prevalentemente statici.

Un'altra idea sugli elenchi di accesso. Puoi anche raggruppare l'utente e differenziare questi diritti dal gruppo in cui si trova l'utente.

EDIT: Al giorno d'oggi vorrei andare definitivamente per un'API protetta e per lo più pagine HTML standard in modo che l'API possa decidere cosa fare per deliever. Questo ha il vantaggio di una risposta rapida e puoi fare tutti i controlli in background.

    
risposta data 21.10.2015 - 20:51
fonte

Leggi altre domande sui tag