如何从OAuth2授权服务器/用户端点获取自定义用户信息

问题描述

解决方案是自定义的实现 UserInfoTokenServices

只需将你的自定义实现提供为Bean,它将使用它而不是默认的实现。

在此UserInfoTokenServices内部,你可以构建所需的对象principal

此UserInfoTokenServices用于从/users授权服务器的端点的响应中提取UserDetails 。如你所见

  1. private Object getPrincipal(Map<String, Object> map) {
  2. for (String key : PRINCIPAL_KEYS) {
  3. if (map.containsKey(key)) {
  4. return map.get(key);
  5. }
  6. }
  7. return "unknown";
  8. }

PRINCIPAL_KEYS默认情况下,仅提取中指定的属性。那正是你的问题。你不仅要提取用户名或你的属性命名的内容,还需要提取更多信息。因此,寻找更多的钥匙。

  1. private Object getPrincipal(Map<String, Object> map) {
  2. MyUserDetails myUserDetails = new myUserDetails();
  3. for (String key : PRINCIPAL_KEYS) {
  4. if (map.containsKey(key)) {
  5. myUserDetails.setUserName(map.get(key));
  6. }
  7. }
  8. if( map.containsKey("email") {
  9. myUserDetails.setEmail(map.get("email"));
  10. }
  11. //and so on..
  12. return myUserDetails;
  13. }

Wiring:

  1. @Autowired
  2. private ResourceServerProperties sso;
  3. @Bean
  4. public ResourceServerTokenServices myUserInfoTokenServices() {
  5. return new MyUserInfoTokenServices(sso.getUserInfoUri(), sso.getClientId());
  6. }

解决方法

我有一个配置有@EnableResourceServer注释的资源服务器,它通过user-info-uri参数引用授权服务器,如下所示:

  1. security:
  2. oauth2:
  3. resource:
  4. user-info-uri: http://localhost:9001/user

授权服务器/用户端点返回其扩展名,org.springframework.security.core.userdetails.User例如带有电子邮件:

  1. {
  2. "password":null,"username":"myuser",...
  3. "email":"me@company.com"
  4. }

每当访问某些资源服务器端点时,Spring都会通过调用授权服务器的/user端点来验证幕后的访问令牌,并且实际上会获取丰富的用户信息(其中包含例如电子邮件信息,我已经使用Wireshark进行了验证)。

所以问题是,如何在不显式第二次调用授权服务器/user端点的情况下获取此自定义用户信息。授权后,Spring是否将其存储在资源服务器上的本地位置?如果没有可用的现成的东西,实现这种用户信息存储的最佳方法是什么?

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”