2013-07-16 19 views
14

Una parte importante di qualsiasi sicurezza dell'autenticazione della piattaforma (PaaS) deve essere in grado di limitare e/o definire una particolare applicazione o "diritti" o permessi dell'utente su base utente/app o per autenticazione a base.Architetture di un modello di autorizzazione autorizzazione della piattaforma

Il modello di autorizzazione comune trovato nella piattaforma moderna o API del prodotto si basa su un'idea di "Ambiti". Nella mia ricerca, GitHub, Facebook, Instagram, Etsy (e altro), tutti utilizzano questo stile di modellazione dei permessi nelle loro implementazioni OAuth. Tuttavia, questo modello "scopes" sembra riguardare solo il modo in cui le applicazioni esterne (ad esempio terze parti) accedono ai dati di un utente autenticato.

Internamente, i modelli di autorizzazione sembrano essere più focalizzati su un modello basato su "ruoli" (amministratore, moderatore, utente, ecc.) O su una serie di altre implementazioni personalizzate.

La mia domanda è questa: "Quale modello di autorizzazione si adatterebbe meglio a un PaaS moderno che vorrebbe sia limitare i suoi utenti da determinate azioni E limitare le applicazioni di terze parti dall'accesso ai dati di un utente, e come potrebbe essere architettato in un modo consapevole delle prestazioni? "

La mia ricerca iniziale mi ha portato a un uso interno ed esterno di un modello di autorizzazione basato su ambito. Sfortunatamente, progettare un tale sistema non è banale. Ho visto diversi metodi di creazione di una tale architettura:

  1. L'AR-friendly relazionale modo DB:

    • Creazione di più tabelle con tabelle unirsi per una relazione molti-a-molti tra un elenco delle autorizzazioni, le autorizzazioni disponibili dell'utente, il token di un utente e le autorizzazioni attive di un token utente.

    • Un utente può autenticarsi con un gettone e specificare come molte autorizzazioni per essere disponibile su quel Segno fino a i permessi originariamente fissati per quell'utente

  2. Il modo intelligente Bit-mascheramento:

    • Utilizzando una colonna integer semplice in un insieme di dati per memorizzare un valore intero

    • Il valore intero si accede in modo binario, utilizzando gli operatori bit per bit per impostare, ottenere, ginocchiera (etc) le autorizzazioni di un utente o di loro gettone rappresentando un ospite come un singolo bit

Loro sembrano essere alcuni pro e contro a ciascuno. La modalità AR-friendly sembra essere una soluzione molto flessibile, ma sembra anche che potrebbe essere un grave problema di prestazioni, poiché sarebbe necessario eseguire più join/query e le istanze del modello ORM dovrebbero essere create su ogni chiamata autenticata . Il metodo di mascheramento dei bit sembra essere molto veloce ed efficiente, ma sarebbe meno intuitivo da sviluppare e sarebbe più soggetto a errori.Inoltre, il bit-masking sembra una soluzione limitante in quanto consentirebbe facilmente un modello di autorizzazione "binario" (può o non può fare) senza middle-ground/happy-medium e che limiterebbe le autorizzazioni a un limite di 64 bit rigido basato su limitazioni hardware.

C'è un altro metodo di modellazione dei permessi o di architettura che mi manca/non penso? O sono sulla buona strada e la considerazione prestazionale non è una preoccupazione così grande (per quanto riguarda il metodo relazionale) come la sto facendo?

Grazie mille!

tl; dr:

Quale modello il permesso sarebbe meglio si adattano una moderna PaaS che vorrebbero sia limitare i propri utenti da determinate azioni e di limitare le applicazioni 3rd party di accedere ai dati di un utente, e come potrebbe essere architettati in un modo attento alle prestazioni?

+1

quanto riguarda le prestazioni è interessato, avete pensato di utilizzare un negozio chiave/valore come Redis per memorizzare i dati di autorizzazione? –

+0

Sì, ci abbiamo pensato. Ma grazie a @DavidAllen, questa è sicuramente una buona idea. Stiamo pensando di mescolare due dei modelli per un mezzo felice. Scriverò una volta che avremo l'idea più "cotta". : D – Rican7

risposta

1

Vorrei iniziare con un'occhiata a Spring Security ACL. Usano bit mask e possono essere (relativamente) facilmente integrati con una cache come ehcache. Se si utilizza JPA per l'accesso ai dati, è possibile utilizzare anche la cache di JPA.

http://static.springsource.org/spring-security/site/docs/current/reference/springsecurity.html

Lo schema:

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-schema.html

OAuth:

http://static.springsource.org/spring-security/oauth/