Spring Security:如何将 UserDetailsService 与 JwtAuthenticationProvider 一起使用?
Posted
技术标签:
【中文标题】Spring Security:如何将 UserDetailsService 与 JwtAuthenticationProvider 一起使用?【英文标题】:Spring Security: How to use a UserDetailsService with JwtAuthenticationProvider? 【发布时间】:2020-02-29 06:50:20 【问题描述】:我有一个使用 Spring MVC 编写的 REST 服务。该服务器是一个 OAuth2 资源服务器,我使用 JwtAuthenticationProvider 来解析 JWT 并将其转换为 Principal。这一切都很好。
但是,我真正想做的是使用 JWT 中声明提供的用户名从数据库加载用户详细信息。然后,新的 Principal 应该替换或(理想情况下)包装 Jwt,以便它可以直接从 SecurityContext 中使用。
我真的很想知道如何做到这一点。 JwtAuthenticationProvider 似乎不适用于 UserDetailsService。我还研究了使用 Converter 进行此操作 - 但扩展 JwtAuthenticationConverter 并不容易,因为 convert 方法是最终的(为什么?)。
所以要非常清楚,这是我理想中想要发生的事情:
-
不记名令牌已提交给服务。
解析 Jwt 并提取声明
使用这些声明之一作为我的用户数据库的键,我可以在其中查找属性、权利等
将这些转换为新的 Principal 对象,该对象在 SecurityContext 的 Authentication 对象中可用。
我的 WebSecurityConfigurerAdapter 中的 configure 方法是这样的:
http.authorizeRequests().antMatchers("/api/*").authenticated().and().oauth2ResourceServer().jwt();
我不可能是唯一一个想将用户数据库与 OAuth2 一起使用的人,所以我一定缺少一些基本的东西吗?我正在使用 Spring Security 5.2.0。
【问题讨论】:
我一直在想同样的事情!您是否能够确定这是否真的受支持? 【参考方案1】:我同意您的担忧 - 我发现覆盖 Spring 的默认处理很有用。有一个 claims extensibility pattern 我与一些提供商一起使用,其中 JWT 处理只是其中的一部分。
我有一个可以运行的 Spring Boot 代码示例 - 它使用自定义过滤器和 Connect2Id 类 - 描述了 OAuth 集成 here。如果有帮助,很乐意回答任何后续问题
【讨论】:
链接很有用。我同意您的模式-我认为大多数大型应用程序都希望采用这种合并声明的方法。我确实觉得奇怪的是没有更多的噪音,但也许正如您在您的一篇文章中指出的那样,假设人们将编写自己的令牌服务器。当我可以改用 Azure AD B2C 之类的东西时,我当然不想这样做,而只是增加这些声明。除非 spring 社区中的某个人有一个很好的选择,否则这似乎是当前的状态。以上是关于Spring Security:如何将 UserDetailsService 与 JwtAuthenticationProvider 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config
Spring Security + Keycloak 授权:如何将端点与资源相关联?
如何将凭据从 Angular 前端传递到 Spring 后端(Spring Security 的基本身份验证)
如何将 Spring Security 与 Spring Boot Rest API 一起使用?