2016-01-15 7 views
7

Hintergrund:Was ist ein gutes Muster für die Implementierung der Zugriffskontrolle in einem GraphQL-Server?

Ich habe eine Reihe von Modellen, einen Benutzer und verschiedenen anderen Modellen einschließlich, von denen einige Verweise auf einen Benutzer enthalten. Ich stelle diese Modelle für die Abfrage über eine GraphQL-API zur Verfügung, die von Graffiti generiert wird und von einer Mongo-Datenbank mit dem Adapter graffiti-mongoose unterstützt wird. Meine aktuelle REST-API (die ich nach GraphQL migriere) verwendet JSON-Webtoken zur Authentifizierung von Benutzern und verfügt über eine benutzerdefinierte Berechtigungslogik auf der Serverseite, um die Zugriffssteuerung zu verwalten.

Problem:

Ich möchte in GraphQL auf dem aktuellen angemeldeten Benutzers basierten Zugriff auf Objekte beschränken. Einige Modelle sollten für nicht authentifizierte Aufrufe verfügbar sein. Die meisten anderen Modelle sollten nur für den Benutzer zugänglich sein, der sie erstellt hat. Wie kann die Zugriffskontrolle auf Objekte über die von Graffiti generierte API am besten verwaltet werden?

Gibt es im Allgemeinen gute Muster der Zugriffskontrolle für GraphQL? Und gibt es vor allem gute Beispiele oder Bibliotheken für Graffiti?

Hinweise:

Ich verstehe, dass vor und nach dem Haken been implemented für Graffiti-Mungo hat, und dass sie can be used grundlegende binäre Kontrollen für die Authentifizierung zu tun. Ich würde gerne sehen, wie eine detailliertere Zugriffskontrolllogik in eine GraphQL-API eingearbeitet werden könnte. Zukünftig möchten wir beispielsweise Administratoren unterstützen, die Zugriff auf Modellinstanzen haben, die von einer bestimmten Gruppe von Benutzern erstellt wurden (z. B. Benutzer, deren Mitgliedschaften die des Administrators enthalten).

+0

Sie sollten in XACML und ABAC suchen, die feinkörnige attributbasierte Zugriffskontrollmodelle sind, die Sie verwenden können, um GraphQL und andere Anwendungen zu sichern. –

Antwort

9

Normalerweise behandelt GraphQL die Zugriffskontrolle nicht direkt, sondern delegiert diese Verantwortung an jedes Datensystem, mit dem es kommuniziert. In deinem Fall klingt das wie Mongoose.

Da die Zugriffskontrolllogik oft willkürliche Logik ist (wurde dieser Benutzer beispielsweise von einigen Inhalten verbannt? Hat der Herausgeber dieses Inhalts diese mit benutzerdefinierten Datenschutzeinstellungen eingeschränkt? Usw.), und es klingt wie in Ihrem Fall Die Zugriffssteuerungslogik ist tatsächlich benutzerdefiniert, sie sollte in der Funktion "resolve" enthalten sein, die einen Wert für ein GraphQL-Feld erzeugt.

Zum Beispiel:

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

Dies kann je nach Projektumfang zu unhandlichem Code führen. Dies ist die offizielle Haltung zur Entkoppelung von Autorisierungen durch Resolver selbst. Http://graphql.org/learn/authorization/ – medv

2

ich eine Regelbasis Zugriffskontrolle erstellen mit GraphQL verwendet werden.

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

Es ist einfach und unopionated, dass es mit oder ohne GraphQL verwendet werden kann.

Sie können es mit einem einfachen JavaScript-Objekten verwenden.

Ich hoffe, es hilft GraphQLers!

+0

Vielleicht möchten Sie sich ansehen [wie man persönliche Open-Source-Bibliotheken anbietet?] (https://meta.stackexchange.com/q/229085) –

+0

Danke. Wusste nicht, dass solche Regeln überhaupt existierten. – Joon

Verwandte Themen