Spring Security 保护Spring GraphQL API免受遍历攻击

8fsztsew  于 2023-03-08  发布在  Spring
关注(0)|答案(2)|浏览(148)

如果我有一个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。

7vux5j2d

7vux5j2d1#

我设法通过如下配置完成了我想要的工作(在此简化-实际上,我将逻辑委托给实现DataFetcher接口的Spring bean,该接口反过来使用@Service:s来处理安全性)。这样,默认的PropertyDataFetcher就被我自己的实现所取代,安全性逻辑可以在其中执行。

@Configuration
public class GraphQLConfig implements RuntimeWiringConfigurer {

    @Autowired
    private SupervisorRepository supervisorRepository;

    @Override
    public void configure(RuntimeWiring.Builder builder) {
        GraphQLCodeRegistry codeRegistry = GraphQLCodeRegistry.newCodeRegistry()
                .dataFetcher(
                        coordinates("User", "supervisor"),
                        (DataFetcher<Supervisor>) environment -> {
                            User user = environment.getSource();

                            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

                            // Do security stuff and find supervisor by the user entity
                            supervisorRepository.find...
                        }
                ).build();

        builder.codeRegistry(codeRegistry);
    }
}
w1jd8yoj

w1jd8yoj2#

我认为,如果对象图的特定部分需要限制,那么依赖JPA延迟加载确实是一个问题。在这种情况下,我认为应用程序可以使用Spring Data 投影的组合来限制暴露的内容,并使用带有Spring Security注解的@SchemaMapping方法进一步分解对象图。

相关问题