Jhipster微服务-在微服务中获取用户ID的正确方法?

Jhipster微服务-在微服务中获取用户ID的正确方法?,jhipster,Jhipster,我在JWT上使用JHipster的网关,我有一个微服务 当rest调用从网关转发到microservice时,在microservice业务类中,我想获取经过身份验证的用户的用户id 原因是我想将其与实体一起保存在DB中,以便一个用户的数据可以与其他用户的数据完全分离(并且一个用户不能更新另一个用户的数据…等等) 虽然我可以获得登录的用户名,但我没有用户id 解决此问题的正确方法是什么: 从微服务呼叫网关 (这对我来说没有太大意义,因为网关正在调用服务,我想知道大多数服务的此信息) 是否更

我在JWT上使用JHipster的网关,我有一个微服务

当rest调用从网关转发到microservice时,在microservice业务类中,我想获取经过身份验证的用户的用户id

原因是我想将其与实体一起保存在DB中,以便一个用户的数据可以与其他用户的数据完全分离(并且一个用户不能更新另一个用户的数据…等等)

虽然我可以获得登录的用户名,但我没有用户id

解决此问题的正确方法是什么:

  • 从微服务呼叫网关
(这对我来说没有太大意义,因为网关正在调用服务,我想知道大多数服务的此信息)

  • 是否更新网关中的令牌提供程序以包含用户Id?(不确定如何做到这一点)。这是正确的方法吗

  • 还有其他建议吗

谢谢, 费格尔


注:我看到其他类似的问题。这不是一个重复的问题。除非绝对确定,否则不要将其标记为副本。注意-我使用JWT来解决这个问题,我在令牌中添加了从网关到每个微服务的用户id

下面是我如何在JHipster生成的代码中解决这个问题的:

在网关中,将UserService添加到UserJWTController,并获取用户id,然后 在创建令牌时使用它

公共响应权限授权(@Valid@RequestBody LoginVM LoginVM){
...
...
可选用户=userService.getUserWithAuthoritiesByLogin(loginVM.getUsername());
Long userId=user.get().getId();
字符串jwt=tokenProvider.createToken(身份验证、记忆、用户标识);
...
将声明添加到令牌:

声明(用户ID\u密钥,用户ID)
注意,我将此添加到令牌提供程序:

private静态最终字符串USER\u ID\u KEY=“userId”;
然后在我的微服务应用程序中,我做了以下操作:

创建了一个新类:

导入org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
导入org.springframework.security.core.GrantedAuthority;
导入java.util.Collection;
公共类SamAuthenticationToken扩展UsernamePasswordAuthenticationToken{
公共长getUserId(){
返回用户标识;
}
私有最终长用户ID;
公共SamAuthenticationToken(对象主体、对象凭据、长用户ID){
超级(负责人、证书);
this.userId=userId;
}

公共SamAuthenticationToken(Object principal,Object credentials,CollectionI将通过替换主题或添加用户id声明来更新TokenProvider。感谢@GaëlMarziou。我发布了我的代码,以便可能对其他人有所帮助。欢迎对我所采取方法的任何反馈。做得好。感谢发布了你的代码。顺便说一下,你在Aut中忘记了一个“t”SamauthenicationToken为什么选择网关?@ddsultan-网关是最合适的地方,因为它是网关背后的许多服务所需要的。通过让网关这样做,每个服务都不必自己做……正如您所看到的,这对网关来说是一个非常小的改变,但非常重要有用。我在一个项目中使用了ISAM(IBM安全和访问管理),他们的反向代理正是这样做的。