我有一个使用Spring MVC编写的REST服务。该服务器是OAuth2资源服务器,我正在使用JwtAuthenticationProvider将JWT解析并转换为Principal。一切正常。
但是,我真正想做的是使用JWT中Claim所提供的用户名从数据库中加载用户详细信息。然后,新的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。