10

バックグラウンド:

User やその他のさまざまなモデルを含む一連のモデルがあり、その一部には User への参照が含まれています。私は、Graffiti-mongoose アダプターを使用する Mongo データベースに支えられた、Graffiti によって生成された GraphQL API を介してクエリを実行するために、これらのモデルを公開します。私の現在の REST API (GraphQL に移行中) は、JSON Web トークンを使用してユーザーを認証し、アクセス制御を処理するためにサーバー側にいくつかのカスタム許可ロジックを持っています。

問題:

現在ログインしているユーザーに基づいて、GraphQL のオブジェクトへのアクセスを制限したいと考えています。一部のモデルは、認証されていない呼び出しによる読み取りにアクセスできる必要があります。他のほとんどのモデルは、それらを作成したユーザーのみがアクセスできる必要があります。Graffiti で生成された API を介してオブジェクトへのアクセス制御を管理する最良の方法は何ですか?

一般に、GraphQL のアクセス制御の適切なパターンはありますか? 特に、Graffiti でそれを行うための良い例やライブラリはありますか?

ノート:

graffiti-mongoose にプレフックとポストフックが実装されており、それらを使用して認証用の基本的なバイナリ チェックを実行できることを理解しています。より詳細なアクセス制御ロジックを GraphQL API に組み込む方法を知りたいです。将来的には、特定のユーザー グループによって作成されたモデル インスタンスにアクセスできる管理者などをサポートしたいと考えています (たとえば、所属に管理者のグループが含まれるユーザー)。

4

2 に答える 2

9

通常、GraphQL はアクセス制御を直接処理するのではなく、その責任をインターフェイスとなるデータ システムに委任します。あなたの場合、それはマングースのように聞こえます。

アクセス制御ロジックは多くの場合任意のロジックであるため (たとえば、このユーザーは一部のコンテンツから禁止されていますか? そのコンテンツの発行者はカスタムのプライバシー設定でそれを制限しましたか? など)、あなたの場合、このアクセス制御ロジックは実際にはカスタムであり、GraphQL フィールドの値を生成する「解決」関数に存在する必要があります。

例えば:

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;
        }
      }
    }
  }
});
于 2016-01-15T22:12:38.567 に答える