假设我有一个用户类型,其中包含以下字段:
type User {
name: String
username: String
someOtherField1: String
someOtherField2: String
someOtherField3: String
someOtherField4: String
creditCardNumber: String
}如果我是在为自己查询,可以返回所有字段,因为信息是我的。因此,将creditCardNumber返回给客户机并不是什么大问题。但是,如果我是在查询其他人,我应该只能访问返回用户的公共信息。返回creditCardNumber将是可怕的。即使我不对客户机上的查询进行编码,如何防止恶意用户挖掘代码、更新客户端查询以包含creditCardNumber并执行它呢?
在GraphQL中实现这种级别的跨查询字段限制的最佳方法是什么?到目前为止,我唯一的想法是创建一个单独的UserSearch类型,即
type UserSearch {
name: String
username: String
someOtherField1: String
someOtherField2: String
someOtherField3: String
someOtherField4: String
}这不包括私有字段,但是这并不让人感到干燥,因为您将创建许多在结构形式上90%相似的类型。
是否有一种更干净的方法来实现这一点,而不是创建不必要的类型或重复的字段?
发布于 2017-06-20 09:26:32
默认情况下,GraphQL类型可能是类型,这意味着您可以向任何字段返回null。
这意味着,在resolve字段的creditCardNumber函数中,可以检查当前用户是否是被获取的用户,如果是,则返回数字。否则,返回null。
要访问当前用户之类的“上下文”数据,GraphQL允许您在执行graphql函数时传递一个对象context:
graphql(schema, query, rootValue, context) // <-- the last parameter您将在每个字段resolve函数签名中找到该对象:
...
resolve: (object, args, context) => {
// Third argument is your object
},
....因此,您可以做的是在上下文中传递当前日志记录的用户:
graphql(schema, query, rootValue, { user: getCurrentLoggedUser() })在User类型中,在creditCardNumber字段解析函数中:
creditCardNumber: {
...
resolve: (user, args, context) => {
if (user.id === context.user.id)
return user.creditCardNumber;
return null;
},
...
}如果您使用的是graphql-express,默认情况下上下文是请求你可以定制它。
https://stackoverflow.com/questions/44641553
复制相似问题