如何在GraphQL查询中检查权限和其他条件?

如何检查用户是否有权 查看查询内容 ?我不知道该怎么做。

  • args?那怎么会工作呢?
  • resolve()?查看用户是否具有许可权,并以某种方式消除/更改某些args?

如果用户是“访问者”,则他只能看到公共帖子,而“管理员”则可以看到所有内容。

    const userRole = 'admin';  // Let's say this could be "admin" or "visitor"

const Query = new GraphQLObjectType({

name: 'Query',

fields: () => {

return {

posts: {

type: new GraphQLList(Post),

args: {

id: {

type: GraphQLString

},

title: {

type: GraphQLString

},

content: {

type: GraphQLString

},

status: {

type: GraphQLInt // 0 means "private", 1 means "public"

},

},

// MongoDB / Mongoose magic happens here

resolve(root, args) {

return PostModel.find(args).exec()

}

}

}

}

})


-猫鼬模型看起来像这样:

    import mongoose from 'mongoose'

const postSchema = new mongoose.Schema({

title: {

type: String

},

content: {

type: String

},

author: {

type: mongoose.Schema.Types.ObjectId, // From user model/collection

ref: 'User'

},

date: {

type: Date,

default: Date.now

},

status: {

type: Number,

default: 0 // 0 -> "private", 1 -> "public"

},

})

export default mongoose.model('Post', postSchema)

回答:

您可以在resolve函数或模型层中检查用户的权限。这是您必须采取的步骤:

  1. 在执行查询之前,对用户进行身份验证。这取决于您的服务器,通常发生在graphql之外,例如通过查看与请求一起发送的cookie。有关如何使用Passport.js进行操作的更多详细信息,请参见此中型帖子。
  2. 将经过身份验证的用户对象或用户ID添加到上下文中。在express-graphql中,您可以通过context参数来实现:

        app.use('/graphql', (req, res) => {

graphqlHTTP({ schema: Schema, context: { user: req.user } })(req, res);

}

  1. 使用resolve函数内部的上下文,如下所示:

        resolve(parent, args, context){

if(!context.user.isAdmin){

args.isPublic = true;

}

return PostModel.find(args).exec();

}

您可以直接在resolve函数中进行授权检查,但是如果您有模型层,我强烈建议您通过将用户对象传递到模型层来在其中实现。这样,您的代码将更具模块化,更易于重用,并且您不必担心忘记解析器中的某些检查。

有关授权的更多背景,请查看此帖子(也由我自己撰写): GraphQL中的Auth-第2部分

以上是 如何在GraphQL查询中检查权限和其他条件? 的全部内容, 来源链接: utcz.com/qa/402079.html

回到顶部