Как настроить фильтр, который передает настроенную карту области Okta в AuthoritiesExtractor - PullRequest
0 голосов
/ 05 октября 2018

Я адаптирую Пример потока кода Okta Spring Security OAuth2 для использования пользовательского AuthoritiesExtractor.При запуске без изменений код возвращает предоставленные полномочия, соответствующие членству в группе - как и ожидалось ...

Предоставленные полномочия: все, другие, другие

Когда я добавляюФильтр - карта, которая прибывает в мой AuthoritiesExtractor, не содержит элемента groups и, следовательно, не доступна для преобразования в Предоставленные полномочия.

Мне удалось выяснить, что, если не использовать фильтр, JWTанализируется ConfigurableAccessTokenConverter.tweakScopeMap (), который корректирует карту по умолчанию утверждений токена доступа JWT.Как я могу настроить свой фильтр на то же самое?

@Bean
protected Filter oktaSsoFilter(
    OAuth2ClientContext oauth2ClientContext,
    MyPrincipalExtractor principalExtractor,
    MyAuthoritiesExtractor authoritiesExtractor,
    AuthorizationCodeResourceDetails authorizationCodeResourceDetails,
    ResourceServerProperties resourceServerProperties)
{
  OAuth2ClientAuthenticationProcessingFilter oktaFilter = new OAuth2ClientAuthenticationProcessingFilter(oktaOAuth2Properties.getRedirectUri());
  OAuth2RestTemplate oktaTemplate = new OAuth2RestTemplate(authorizationCodeResourceDetails, oauth2ClientContext);
  oktaFilter.setRestTemplate(oktaTemplate);

  OktaUserInfoTokenServices tokenServices = new OktaUserInfoTokenServices(resourceServerProperties.getUserInfoUri(),
      authorizationCodeResourceDetails.getClientId(), oauth2ClientContext);
  tokenServices.setRestTemplate(oktaTemplate);
  tokenServices.setPrincipalExtractor(principalExtractor);
  tokenServices.setAuthoritiesExtractor(authoritiesExtractor);
  oktaFilter.setTokenServices(tokenServices);

  return oktaFilter;
}

@Configuration
static class OAuth2SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter
{
  private final Filter oktaSsoFilter;
  private final OktaOAuth2Properties oktaOAuth2Properties;

  OAuth2SecurityConfigurerAdapter(Filter oktaSsoFilter, OktaOAuth2Properties oktaOAuth2Properties)
  {
    this.oktaSsoFilter = oktaSsoFilter;
    this.oktaOAuth2Properties = oktaOAuth2Properties;
  }

  @Bean
  protected AuthenticationEntryPoint authenticationEntryPoint()
  {
    return new LoginUrlAuthenticationEntryPoint(oktaOAuth2Properties.getRedirectUri());
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception
  {
    http
        .addFilterAfter(oktaSsoFilter, AbstractPreAuthenticatedProcessingFilter.class)
        .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.GET, oktaOAuth2Properties.getRedirectUri()).authenticated();
  }
}
...