Schema Stitching 的私域字段隔离:权限与可见性控制
深入 GraphQL Schema Stitching 中的字段级权限,基于 federated schema 实现不同消费端(如管理员、普通用户)对同一服务的部分字段不可见。 · 难度:入门 · +10XP
Schema Stitching 的私域字段隔离:权限与可见性控制
在微服务架构中,Schema Stitching 往往将所有字段暴露给所有客户端,但业务要求某些字段仅对特权用户可见。本教程将教你使用 @graphql-tools/stitch 中的 delegation 与 transforms 技术,在缝合层动态移除或替换字段,而非在数据源修改。核心技巧是利用 'FilterObjectFields' transform 在运行时根据上下文(context.user.role)剥离私域字段,并配合自定义指令 @canSee 实现声明式权限控制。最后我们会构建一个网关,使得同一 schema 对 admin 和 guest 返回不同结构。
const { stitchSchemas } = require('@graphql-tools/stitch');
const { FilterObjectFields } = require('@graphql-tools/wrap');
const schema = stitchSchemas({
subschemas: [{
schema: userSchema,
transforms: [
new FilterObjectFields((typeName, fieldName) => {
// 对普通用户隐藏 email 字段
return typeName === 'User' && fieldName === 'email' ? false : true;
})
]
}]
});