当前位置: 首页 > 面试题库 >

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

祝高阳
2023-03-14
问题内容

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

  • 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部分



 类似资料:
  • 问题内容: 在MySQL以外的任何事物中,它感觉都非常简单。 基本上,我需要根据一个特定术语返回多少结果来切换我正在使用的索引类型以及其他一些条件。 效果: MySQL语句中可能吗? 编辑: 查询A: 查询B: 查询切换的原因是,根据“术语”的流行程度,我得到的结果时间截然不同。 问题答案: 编辑: 我下面说的关于要求存储过程的说法是不正确的。尝试这个: 确实,这是一个case表达式,在存储的pr

  • 此代码用于测试应用程序是否具有权限,如果您具有权限,则返回true,否则返回false。 错误: PID:25504 java.lang.NullPointerException:试图在Android.Content.Context Android.Content.Content.Context.GetApplicationContext(view.java:21147)在Android.os.h

  • 我读过https://github.com/leangen/graphql-spqr-spring-boot-starter但是我仍然有点困惑如何将代码中的内容映射到我需要在GraphQL请求中查询的内容。 我有上面的代码。我是GraphQL的新手,但我认为查询需要看起来像这样,其中getTrades是我要调用的方法的名称,tradeId是我要检索的字段。 } 我希望我能拿回一个交易列表。但是,我

  • 问题内容: 我有两个班,并有一个互相一一对应关系。这是它们的注释方式。 如您所见,是关系的所有者,并且是此双向关系的另一端。InvitedTech也与 Now 有关系,当我编写一个简单查询以获取所有排期时,它总共触发三个查询。第一个让我得到结果,但是触发了另外两个查询。 查询所有航班(这是我唯一需要的航班) 通过InvitedTech和Flight之间的联接进行查询 在被邀请的科技公司和酒店之间进

  • 在变换的中间,我从表ABC中创建COL1、COL2和COL3、COL4、COL5。 我通常按如下方式转换这些类型的脚本,然后在查找组件中将列与col1到col5匹配: 我想检查:1-我的方法正确吗?我的意思是,如果记录的数量很高,那么我们可能会面临这个问题,然而,这个查询只返回单行记录。 2-如果我想使用第一种方法,我如何传递参数?我试着去读以前的帖子(以前的解决方案),但问题是我处于一个转换的中

  • 在Android M(预览版)中,用户可以选择特定的应用程序并检索特定的权限。 所以我想问的是如何在运行时检查授权权限?