解決策は、カスタムの実装です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
ます。
/users
この UserInfoTokenServices は、認可サーバーのエンドポイントの応答から 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 リリース ノートを参照)。