Facebook 的官方说法是 Relay 是“故意不了解身份验证机制 https://stackoverflow.com/a/32544246/741970在Relay存储库的所有示例中,身份验证和访问控制是一个单独的关注点。在实践中,我还没有找到一种简单的方法来实现这种分离。
中继存储库中提供的示例都具有带有viewer
假设有一个用户的字段。该用户可以访问所有内容。
然而,实际上,一个应用程序有很多用户,每个用户对每个节点的访问程度不同。
假设我在 JavaScript 中有这个模式:
export const Schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: () => ({
node: nodeField,
user: {
type: new GraphQLObjectType({
name: 'User',
args: {
// The `id` of the user being queried for
id: { type: new GraphQLNonNull(GraphQLID) },
// Identity the user who is querying
session: { type: new GraphQLInputObjectType({ ... }) },
},
resolve: (_, { id, session }) => {
// Given `session, get user with `id`
return data.getUser({ id, session });
}
fields: () => ({
name: {
type: GraphQLString,
resolve: user => {
// Does `session` have access to this user's
// name?
user.name
}
}
})
})
}
})
})
});
从查询用户的角度来看,某些用户是完全私密的。其他用户可能只向查询用户公开某些字段。因此,要获取用户,客户端不仅必须提供他们正在查询的用户 ID,而且还必须标识自己,以便进行访问控制。
随着控制访问的需求逐渐渗透到图表中,这似乎很快就会变得复杂。
此外,我需要控制每个根查询的访问,例如nodeField
。我需要确保每个节点都实现nodeInterface
.
所有这些看起来都是大量的重复性工作。是否有任何已知的模式可以简化此操作?我是否错误地思考了这个问题?