Я адаптирую Пример потока кода 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();
}
}