spring oauth 2フレームを使って、現在登録されているユーザ情報の実現コードを取得します。


spring oauth 2フレームを使ってライセンス認定をします。現在のユーザ情報を取得したいですが、どうすればいいですか?
spring oauth 2はspring securityに基づく実現であることを知っています。
spring securityは、SecurityContect Holder.get Contect().get Authentication().get Principalを通じて現在のユーザ情報を取得することができます。
spring oauth 2はSecurityContect Holder.get Contect().get Authentication().get Principalを通じて現在のユーザ名しか取得できません。
しかし、実際に開発する過程で、私たちがよく使うのは大体ユーザーのidです。
設定で現在のユーザの情報を取得するにはどうすればいいですか?
まず、なぜoauth 2がSecurityContect Holder.get Contication().get Authentication().get Principalで取得したのかを確認します。
ソースコードを確認します
Default User Authentication Coverter.java

public Authentication extractAuthentication(Map<String, ?> map) {
      // userClaimName     :username
  if (map.containsKey(userClaimName)) {
    Object principal = map.get(userClaimName);
    Collection<? extends GrantedAuthority> authorities = getAuthorities(map);
          //       。  userDetailsService  ,        。
    if (userDetailsService != null) {
      UserDetails user = userDetailsService.loadUserByUsername((String) map.get(userClaimName));
      authorities = user.getAuthorities();
      principal = user;
    }
    return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
  }
  return null;
}
このクラスにします。userDetails Serviceを設置します。
私たちはこのクラスの呼び出しを見ます。
Default Access TokenCoverter.java

public class DefaultAccessTokenConverter implements AccessTokenConverter {
    //           ,      userDetailsService
  private UserAuthenticationConverter userTokenConverter = new DefaultUserAuthenticationConverter();
   
 
  //      setter  ,                。
  public void setUserTokenConverter(UserAuthenticationConverter userTokenConverter) {
    this.userTokenConverter = userTokenConverter;
  }
 
}
ですから、Default Access TokenCoverterを使うなら、コードはこのように書くことができます。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
 
  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.tokenStore(tokenStore)
        .authenticationManager(manager)
        .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
        .userDetailsService(userService)
        // .accessTokenConverter(tokenConverter);
 
 
    DefaultAccessTokenConverter converter = new DefaultAccessTokenConverter();
    DefaultUserAuthenticationConverter userAuthenticationConverter
        = new DefaultUserAuthenticationConverter();
    userAuthenticationConverter.setUserDetailsService(userService);
    converter.setUserTokenConverter(userAuthenticationConverter);
    endpoints.accessTokenConverter(converter);
  }
 
}
jwtConverterを使うなら、このように変えられます。
accessTokenCoverterを定義してDefault Access Token Coverterを継承します。

public class OauthAccessTokenConverter extends DefaultAccessTokenConverter {
  public OauthAccessTokenConverter(SecurityUserService userService) {
    DefaultUserAuthenticationConverter converter = new DefaultUserAuthenticationConverter();
    converter.setUserDetailsService(userService);
    super.setUserTokenConverter(converter);
  }
}
jwt Converterを定義してJwtAccess TokenCoverを継承します。

public class OauthJwtAccessTokenConverter extends JwtAccessTokenConverter {
 
  public OauthJwtAccessTokenConverter(SecurityUserService userService) {
    super.setAccessTokenConverter(new OauthAccessTokenConverter(userService));
  }
}
ログイン

@Configuration
public class TokenConfig {
  @Bean
  public TokenStore jwtTokenStore(JwtAccessTokenConverter converter) {
    return new JwtTokenStore(converter);
  }
 
  @Bean
  public JwtAccessTokenConverter jwtAccessTokenConverter(SecurityUserService userService) {
    JwtAccessTokenConverter accessTokenConverter = new OauthJwtAccessTokenConverter(userService);
    accessTokenConverter.setSigningKey("sign_key");
    return accessTokenConverter;
  }
}
Oauth 2認証サービス

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
 
  @Autowired
  private AuthenticationManager manager;
  @Autowired
  private SecurityUserService userService;
  @Autowired
  private TokenStore tokenStore;
  @Autowired
  private JwtAccessTokenConverter tokenConverter;
 
  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.tokenStore(tokenStore)
        .authenticationManager(manager)
        .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
        .userDetailsService(userService)
        .accessTokenConverter(tokenConverter);
  }
}
最後はspring securityのようにできます。
SecurityContection xt Holder.get Conttext().get Authentication()を使ってユーザ情報を取得しました。
以上で、spring oauth 2について現在ログインしているユーザ情報を取得した記事を紹介します。spring oauth 2ログインユーザ情報の内容については、以前の文章を検索したり、下記の関連記事を引き続き閲覧したりしてください。これからもよろしくお願いします。