资源服务器获取用户信息,spring – 如何从OAuth2授权服务器/用户端点获取自定义用户信息...

我有一个配置了@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":"me@company.com"

}

无论何时访问某个资源服务器端点,Spring都会通过调用授权服务器的/用户端点来验证后台的访问令牌,它实际上会返回丰富的用户信息(其中包含例如电子邮件信息,我已使用Wireshark验证了该信息).

所以问题是如何在没有明确第二次调用授权服务器/用户端点的情况下获取此自定义用户信息. Spring是否在授权后将其存储在资源服务器本地的某个位置,或者如果没有任何可用的开箱即用,那么实现此类用户信息存储的最佳方式是什么?

解决方法:

解决方案是实现自定义UserInfoTokenServices

只需将您的自定义实现作为Bean提供,它将被用来代替默认实现.

在UserInfoTokenServices中,您可以按照自己的意愿构建主体.

此UserInfoTokenServices用于从授权服务器的/ usersendpoint的响应中提取UserDetails.正如你所看到的那样

private Object getPrincipal(Map map) {

for (String key : PRINCIPAL_KEYS) {

if (map.containsKey(key)) {

return map.get(key);

}

}

return "unknown";

}

默认情况下,仅提取PRINCIPAL_KEYS中指定的属性.这就是你的问题.您必须提取的不仅仅是用户名或任何属性的名称.所以寻找更多的钥匙.

private Object getPrincipal(Map 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更新事情变得越来越容易!