具有弹簧安全性的 JWT 身份验证 graphql-spqr

Posted

技术标签:

【中文标题】具有弹簧安全性的 JWT 身份验证 graphql-spqr【英文标题】:JWT Authentication graphql-spqr with spring security 【发布时间】:2021-06-05 18:11:59 【问题描述】:

我在我的 spring boot 应用程序中使用 graphql-spqr-spring-boot-starter,版本 0.0.5。

@GraphQLApi 和 @GraphQLQuery 工作正常,我也在 /gui 上获取数据。

但正如许多人所面临的那样,我正在尝试在 graphql 服务器调用上应用身份验证部分。我在我的应用程序中使用 JWT 令牌进行 REST API 授权/身份验证。

所以我有令牌,我想它也可以在这里用于验证。

我尝试过使用:

@PreAuthorize("hasRole('ROLE_RECRUITER_HR')")

但它给出了编译时错误:

io.leangen.graphql.metadata.exceptions.TypeMappingException: com.sun.proxy.$Proxy90 类型的注册对象似乎是 动态生成的代理

对于这些和其他可能的问题,是使用像 spring-boot-starter 这样的包装器 graphql 库更好,还是使用我手中更多步骤的 graphql-spqr 更安全。

【问题讨论】:

嗯,最近的版本真的不应该发生这种情况。 Spring Security 应该透明地工作。是否有可能在某个地方看到您的项目?或者,如果没有,我能否麻烦您举一个重现该问题的示例,我会为您解决问题?我预计会发生这种情况的唯一情况是,如果您使用 GraphQLSchemaGenerator#withOperationsFromSingleton 手动注册 bean,但由于您提到您使用的是启动器,我认为这不是您在做的事情。 是的,我可以在 github 的 repo 中添加你。请分享您的用户名 是@kaqqao,和这里一样 已添加。还有一个单独的 graph-impl 分支用于测试。 【参考方案1】:

编辑:GraphQL SPQR Spring Boot starter v0.0.6 解决了这个问题,应该可以开箱即用。

这是启动器中的一个错误。当使用 JDK 代理(而不是 CGLib)时,它不能正确检测类型。我将确保在下一个版本中修复此问题。 有几种方法可以暂时解决这个问题,但不幸的是,它们都不是很好。

你可以例如强制 Spring 使用 CGLIB,例如

@EnableAspectJAutoProxy(proxyTargetClass = true)

但这可能会产生广泛的影响,因此我建议您稍等片刻。我会在几天后发布一个带有修复程序的新版本,因为这是一个非常重要的错误。

【讨论】:

是的,我将等待新版本发布,而不是使用 CGLIB。我希望,一旦新版本发布,它就可以完美运行。谢谢。 对此的任何更新。我要面对同样的问题 @Doogle 你试过新版本了吗? @kaqqao :它适用于 0.0.6 启动器,没有任何故障。一如既往地感谢您的出色工作。

以上是关于具有弹簧安全性的 JWT 身份验证 graphql-spqr的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义外部表单和弹簧安全性的 CAS 身份验证

JWT 身份验证:使用 UI 令牌对 Graphene/Django (GraphQL) 查询进行身份验证?

如何绕过特定域的经过身份验证的端点上的弹簧安全性?

如何在 graphql 中为基于 jwt 的身份验证实现自动刷新令牌?

使用 flask-jwt-extended + ariadne (graphql) + react 设置身份验证/授权

如何自定义 django jwt graphql 身份验证