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

谢尔盖·包克(Sergey Pauk):

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

security:
  oauth2:
    resource:
      user-info-uri: http://localhost:9001/user


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

{  
   "password":null,
   "username":"myuser",
    ...
   "email":"[email protected]"
}


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

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

扬尼克·克莱姆(Yannic Klem):

解决方案是实现自定义 UserInfoTokenServices

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/UserInfoTokenServices.java

只需将您的自定义实现作为Bean提供即可,它将代替默认的实现使用。

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

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

private Object getPrincipal(Map<String, Object> map) {
    for (String key : PRINCIPAL_KEYS) {
        if (map.containsKey(key)) {
            return map.get(key);
        }
    }
    return "unknown";
}

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

private Object getPrincipal(Map<String, Object> map) {
    MyUserDetails myUserDetails = new myUserDetails();
    for (String key : PRINCIPAL_KEYS) {
        if (map.containsKey(key)) {
            myUserDetails.setUserName(map.get(key));
        }
    }
    if( map.containsKey("email") {
        myUserDetails.setEmail(map.get("email"));
    }
    //and so on..
    return myUserDetails;
}

接线:

@Autowired
private ResourceServerProperties sso;

@Bean
public ResourceServerTokenServices myUserInfoTokenServices() {
    return new MyUserInfoTokenServices(sso.getUserInfoUri(), sso.getClientId());
}

!!使用Spring Boot 1.4进行更新变得越来越容易了!

在Spring Boot 1.4.0 中引入PrincipalExtractor应该实现此类以提取自定义主体(请参阅Spring Boot 1.4发行说明)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在spring security oauth2授权服务器中通过jwt令牌获取用户信息?

WSO2身份服务器用户自定义

如何在spring-security-oauth2中的资源服务器中获取自定义UserDetailService对象?

自定义 Oauth2 授权服务器 - AccessDeniedException:访问被拒绝

通过Spring Security的授权使用OAuth2数据创建自定义用户

针对项目和自定义项目特定用户角色的OAuth2授权

将用户重定向到oauth2授权服务器以获取令牌Spring Boot

OAuth2自定义基本用户模型

如何从 Google OAuth2 获取用户信息

如何在Spring OAuth2资源服务器中使用自定义UserDetailService?

Lambda Cognito用户池授权者-我可以自动获取自定义用户属性吗?

OAuth2用户端凭证通过Spring引导Keycloak集成信息流

Firebase-自定义oAuth2服务-授权代码?

如何获取自定义UITableViewCell以获取用户对首选文本大小的更改?

如何获取自定义Azure AD B2C用户配置文件属性的值

如何从UserProfile获取自定义信息?

Java如何在服务器端获取自定义的HTTP请求头

Django-如何使用get_object_or_404获取自定义用户模型

如何刷新的OAuth2令牌使用Spring Security 5 OAuth2用户端和RestTemplate

如何使用Scribe通过POST向自定义API发出OAuth2授权请求

WS02 身份服务器用户会话端点

自定义http安全配置以及OAuth2资源服务器

Docker容器上的解析服务器的自定义身份验证(OAuth2)

django 中自定义用户身份验证和 oauth2 的问题

获取 OAuth2 JWT 的用户配置文件信息

调用spring授权服务器OAuth2 REST端点

如何访问授权用户的自定义标签助手

如何在 light-oauth2 令牌端点上使用 client_authenticated_user 自定义授权类型

自定义git服务器在推送时获取用户输入