@neo4j/graphql 和 @auth 指令用于 CRUD 操作

问题描述 投票:0回答:1

我正在使用

@neo4j/graphql
库来定义我的 graphql API 接口。我有我的 Todo 模型,我希望任何人都可以阅读它,但我希望只有管理员角色才能编辑它。我使用 NestJS 作为后端。类型定义如下:

// type-defs.ts
export typeDefs = gql(`
type Todo {
    id: ID! @id
    owner: String!
    title: String
  }

  extend type Todo
    @auth(
      rules: [
        { operations: [READ], allowUnauthenticated: true }
        { operations: [CREATE, DELETE, UPDATE], allow: { roles: ["ADMIN"] } }
      ]
    )
`);


// gql.module.ts

const neoSchema = new Neo4jGraphQL({
  typeDefs,
  driver,
  plugins: {
    auth: new Neo4jGraphQLAuthJWKSPlugin({
      jwksEndpoint: `https://cognito-idp.${process.env.COGNITO_REGION}.amazonaws.com/${process.env.COGNITO_USER_POOL_ID}`,
    }),
  },
});

@Module({
  providers: [],
  imports: [
    GraphQLModule.forRootAsync<ApolloDriverConfig>({
      driver: ApolloDriver,
      useFactory: async () => {
        const schema = await neoSchema.getSchema();
        await neoSchema.assertIndexesAndConstraints({
          options: { create: true },
        });
        return {
          playground: true,
          schema,
          // // change property `cognito:groups` to `roles` in the jwt.payload passed to Neo4jGraphQLAuthJWKSPlugin
          context: authContextFunction,
        };
      },
    }),
  ],
})
export class GqlModule {}

我希望所有用户都能够阅读它,但只有登录的管理员才能执行任何 CUD 操作。 如果我在没有令牌的情况下运行它,我会收到

Unauthenticated
错误,这是完美的。 但是,当我使用手动生成的令牌时,它允许我创建内容。这是传递给身份验证插件的令牌:

 {
  sub: '10',
  email: '[email protected]',
  iat: 1562061850,
  exp: 1562065450,
  roles: [ 'B' ]
}

neo4j graphql nestjs neo4j-graphql-js
1个回答
2
投票

您的架构的问题在于它如何使用该属性 允许 应用于与节点中的属性进行匹配, 要使用 JWT 字段角色执行检查,那么您应该使用属性 roles

用你的例子:

type Todo {
  id: ID! @id
  owner: String!
  title: String
}

extend type Todo @auth(
  rules: [
    { operations: [READ], allowUnauthenticated: true }
    { operations: [CREATE, DELETE, UPDATE], roles: ["ADMIN"] }
  ]
)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.