gpt4 book ai didi

具有多个用户表的 Spring Oauth

转载 作者:行者123 更新时间:2023-12-05 06:40:11 25 4
gpt4 key购买 nike

我正在使用带有 Oauth2 的 Spring 创建一个应用程序作为两个应用程序(提供者应用程序和消费者应用程序)的后端。我有两种不同类型的用户;提供者和消费者,每个都有自己的数据库表。我面临的问题是我无法找到一种方法来了解请求是来自提供商还是来自客户,因为每个请求都位于不同的数据库表中。

用户名在两个表中是不唯一的。因此,提供者和消费者可以拥有相同的用户名(和密码)。我认为以下任何解决方案都足够了,但是,我找不到任何方法来实现它们。

  • 为每个用户类别提供两个不同的端点。例如“/provider/oauth/token”和“/consumer/oauth/token”。每个都有其自定义身份验证管理器。
  • 或者:在同一个 Spring 应用程序中拥有两个授权服务器,然后将它们的“/oauth/token”映射到不同的端点。
  • 或者:在 oauth 请求中发送自定义数据以了解请求的来源,然后动态选择身份验证管理器。
  • 或者:将不同的身份验证管理器关联到不同的 OAuth 客户端,然后确保每个应用程序都有其各自的客户端 ID。

如果这些解决方案中的任何一个可行,或者如果有其他方法可以实现此目的,请告诉我。感谢您的帮助。

编辑 - 解决方案

按照下面的回答,我添加了另一个具有不同客户端 ID 的客户端,检查 UserDetailsS​​ervice 中的 ID,然后决定使用哪个数据库。这是代码:

  public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
UsernamePasswordAuthenticationToken authentication = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getPrincipal();
String username = user.getUsername();
if (username.equals(OAuth2Configuration.provider_app))
// Load from provider db
else if (username.equals(OAuth2Configuration.consumer_app))
// Load from consumer db
else
throw new UsernameNotFoundException("ClientID " + username + " not found.");
}
};
}

UsernamePasswordAuthenticationToken 用作/oauth/token,使用客户端 ID 和密码通过 Basic Oauth 进行保护。

最佳答案

我认为您应该能够查看 SecurityContextHolder.getContext().getAuthentication 内部。这应该是 OAuth2Authentication 的一个实例,您可以(在转换之后)从中调用 getOAuth2Request()获取原件 Oauth2Request详情。

有了这些信息,您就可以拥有一个 UserDetailsS​​ervice,它可以将查找委托(delegate)给正确的数据库表。您可以使用范围或资源 ID 来帮助确定要使用的数据库表。

关于具有多个用户表的 Spring Oauth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43240480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com