如果我有一个GraphQL API,如下所示:
type Query {
userById (id: ID): User
}
type User {
id: ID
name: String
secret: String
supervisor: Supervisor
}
type Supervisor {
id: ID
name: String
users: [User]
}
用户X登录并触发合法查询:
query {
userById (id: "X") {
name
secret
supervisor: {
name
}
}
}
他被授权,因为他可以访问自己的用户对象。
但是如果用户将查询修改为:
query {
userById (id: "X") {
name
secret
supervisor: {
name
users {
secret
}
}
}
}
我如何通过遍历图表来防止用户获取其他用户。特别是使用Spring for GraphQL,https://spring.io/projects/spring-graphql。我还使用Spring Security。
2条答案
按热度按时间7vux5j2d1#
我设法通过如下配置完成了我想要的工作(在此简化-实际上,我将逻辑委托给实现DataFetcher接口的Spring bean,该接口反过来使用@Service:s来处理安全性)。这样,默认的PropertyDataFetcher就被我自己的实现所取代,安全性逻辑可以在其中执行。
w1jd8yoj2#
我认为,如果对象图的特定部分需要限制,那么依赖JPA延迟加载确实是一个问题。在这种情况下,我认为应用程序可以使用Spring Data 投影的组合来限制暴露的内容,并使用带有Spring Security注解的
@SchemaMapping
方法进一步分解对象图。