如何在Hasura中自定义GraphQL端点为不同客户提供独立Schema?
实现Hasura多客户端点与Schema隔离
是的,完全可以实现给不同客户分配独立的GraphQL端点和对应Schema,解决统一端点的混乱和数据可见性问题,结合你已有的dc-agents自定义连接器,具体方案如下:
1. 利用Hasura的多GraphQL API功能(推荐)
Hasura Enterprise Edition(或Hasura Cloud付费方案)支持创建多个独立的GraphQL API实例,每个实例可实现:
- 配置专属端点路径(如
/graphql/customer1、/graphql/customer2) - 关联独立Schema(包括通过dc-agents接入的自定义数据源)
- 设置单独的权限规则、GraphiQL访问权限
操作步骤:
- 登录Hasura控制台,进入APIs页面,点击Create New API
- 为每个客户的API设置唯一名称和GraphQL Path(比如
customer1对应路径/graphql/customer1) - 为该API添加对应数据源:包括你用dc-agents创建的自定义连接器及所需数据库
- 配置API专属Schema:仅暴露该客户需要的表、字段、自定义查询/突变,屏蔽无关数据
- 配置GraphiQL权限:限制该API的GraphiQL界面仅对授权用户开放,且仅展示当前API的Schema
2. 反向代理+Hasura权限隔离(开源版替代方案)
若使用Hasura开源版,可通过反向代理(如Nginx)配合Hasura的行级权限、Schema权限实现:
- 用Nginx配置不同路径转发至同一Hasura实例,同时携带不同的
X-Hasura-Role或自定义请求头 - 在Hasura中为每个客户创建专属角色,配置严格的Schema权限(仅允许访问该客户的表/字段)和行级权限(仅能访问自身数据)
- 不同路径下,Nginx自动注入对应角色头,Hasura会根据角色返回匹配的Schema和数据
- 配置GraphiQL:通过请求头切换角色,或为不同角色禁用GraphiQL访问
Nginx配置示例:
server { listen 80; server_name your-hasura-domain.com; location /graphql/customer1 { proxy_pass http://hasura-instance:8080/v1/graphql; proxy_set_header X-Hasura-Role customer1_role; proxy_set_header X-Hasura-User-Id customer1; } location /graphql/customer2 { proxy_pass http://hasura-instance:8080/v1/graphql; proxy_set_header X-Hasura-Role customer2_role; proxy_set_header X-Hasura-User-Id customer2; } }
3. 结合dc-agents的注意事项
- 为每个客户的API单独配置dc-agents连接器,确保每个连接器仅访问该客户对应的数据源
- 在Hasura中为每个API的自定义数据源设置权限,避免跨客户数据访问
- 测试每个端点的Schema:通过GraphiQL访问对应路径,确认仅展示该客户的Schema和数据
内容的提问来源于stack exchange,提问作者Chilarai
相关产品推荐
相关产品推荐

