2016-01-15 13 views
7

Background:Qual è un buon modello per l'implementazione del controllo accessi in un server GraphQL?

Ho una serie di modelli, tra cui un utente e vari altri modelli, alcuni dei quali contengono riferimenti a un utente. Sto esponendo questi modelli per l'interrogazione tramite un'API GraphQL generata da Graffiti, supportata da un database Mongo usando l'adattatore graffiti-mongoose. La mia attuale API REST (che sto migrando a GraphQL) utilizza token Web JSON per autenticare gli utenti e ha alcune regole di autorizzazione personalizzate sul lato server per gestire il controllo degli accessi.

Problema:

vorrei limitare l'accesso agli oggetti in GraphQL basate sulla vigente utente connesso. Alcuni modelli dovrebbero essere accessibili per le letture da chiamate non autenticate. La maggior parte degli altri modelli dovrebbe essere accessibile solo all'utente che li ha creati. Qual è il modo migliore per gestire il controllo degli accessi agli oggetti tramite l'API generata da Graffiti?

In generale, ci sono buoni modelli di controllo degli accessi per GraphQL? E in particolare, ci sono dei buoni esempi o librerie per farlo con Graffiti?

Note:

Capisco che i ganci pre e post hanno been implemented per graffiti-mangusta, e che can be used fare controlli binari di base per l'autenticazione. Mi piacerebbe vedere come una logica di controllo dell'accesso più dettagliata possa essere elaborata in un'API GraphQL. In futuro, desideriamo supportare elementi come amministratori che hanno accesso a istanze di modelli create da un determinato gruppo di utenti (ad esempio utenti le cui affiliazioni includono quella dell'amministratore).

+0

Si dovrebbe esaminare XACML e ABAC che sono modelli di controllo dell'accesso basati su attributi a grana fine che è possibile utilizzare per proteggere GraphQL e altre app –

risposta

9

In genere GraphQL non gestisce direttamente il controllo di accesso, delegando invece tale responsabilità a qualsiasi sistema di dati con cui si interfaccia. Nel tuo caso suona come Mongoose.

Dal momento che la logica di controllo degli accessi è spesso logica arbitraria (ad esempio, questo utente è stato escluso da alcuni contenuti? L'editore di tale contenuto lo ha limitato con le impostazioni di privacy personalizzate? Ecc.) E suona come nel tuo caso la logica di controllo degli accessi è infatti personalizzata, dovrebbe vivere nella funzione "risoluzione" che produce un valore per un campo GraphQL.

Ad esempio:

var UserType = new GraphQLObjectType({ 
    name: 'User', 
    fields: { 
    name: { type: GraphQLString }, 
    birthday: { 
     type: GraphQLString, 
     resolve(user, context) { 
     var auth = context.myLoggedInAuth; 
     if (myCanAuthSeeBirthday(auth, user)) { 
      return user.birthday; 
     } 
     } 
    } 
    } 
}); 
+2

Ciò potrebbe comportare un codice ingombrante a seconda dell'ambito del progetto. Questa è la posizione ufficiale sulla disattivazione dell'autorizzazione da parte dei risolutori http://graphql.org/learn/authorization/ – medv

2

Creo un controllo di accesso rule base da utilizzare con GraphQL.

https://github.com/joonhocho/graphql-rule

È semplice e unopionated che può essere utilizzata con o senza GraphQL.

È possibile utilizzarlo con un semplice oggetto javascript.

Spero che aiuti GraphQLers!

+0

Si potrebbe voler vedere [Come offrire librerie open source personali?] (https://meta.stackexchange.com/q/229085) –

+0

Grazie. Non sapevo che tali regole esistessero addirittura. – Joon

Problemi correlati