GraphQL with Casbin(RBAC with domain, field level) 访问控制
February / 16 / 2020
最近在做一些 GraphQL 相关的技术验证,预期要用到生产环境中,第一件要解决的事情就是访问控制了。这里通过一个小例子来分享我的解决思路。大体思路:使用 casbin RBAC model,在 GraphQL server 的 resolver func ( data loader )中对我们的输入请求进行字段级别的访问控制。
前言
使用到的库
源码 https://github.com/WenyXu/gqlgen_casbin_RBAC_example
动手实验
define schema.graphql
create todo.go
updatge gqlgen.yml
generate code
Implement the resolvers
resolver.go
注:真实环境中会在 resolver.go 实现 data loader ,接入 ORM or low level raw SQL 我们的表单字段相关访问控制将在 data loader 层中实现
Initialize Casbin enforcer
Casbin 文档:https://casbin.org/docs/en/supported-models 这个例子中,我们将使用 RBAC model 作为我们的模型,本示例仅演示使用该模型去控制我们 graphQL 的输入 fileds 。 casbin.go
rbac_with_domains_model.conf
注:真实环境中我们的 policy model 会从配置中心读取 (watching or by pub/sub)可 实现热更新 rbac_with_domains_policy.csv
注:真实环境中我们的 policy 数据会从配置中心读取(watching or by pub/sub)
update resolver
(吐槽:实现 resolver 所有代码后感叹,es 一个 map 能实现的事... go要用 reflect 去实现) resolver.go
sub = user 情况
sub !=user 情况(没有写入权限的情况下),没有权限的字段写入被过滤