解决方案是自定义的实现
UserInfoTokenServices
只需将你的自定义实现提供为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;}Wiring:
@Autowiredprivate ResourceServerProperties sso;@Beanpublic ResourceServerTokenServices myUserInfoTokenServices() { return new MyUserInfoTokenServices(sso.getUserInfoUri(), sso.getClientId());}


