Как извлечь претензии из Spring Security OAuht2 Boot на сервере ресурсов? - PullRequest
1 голос
/ 28 июня 2019

У меня есть сервер авторизации, встроенный в .Net Core, использующий Identity Server 4 ! Он работает, как ожидается, для авторизации клиентов и ресурсов из Node Js и .Net. Теперь я пытаюсь добавить Java Spring Boot 2 API (jdk 1.8) в качестве защищенного ресурса. Я достиг этой цели с помощью OAuth2 Boot Documentation ! Пока все отлично работает. Теперь мне нужно извлечь заявки из токена доступа, сгенерированного сервером авторизации. Это токен на предъявителя типа JWT. Реализация, которую я имею для этого, следующая:

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {
  public String resourceId;

  @Autowired
  public SecurityConfiguration(@Value("${security.oauth2.resource.id}") String resourceId) {
    this.resourceId = resourceId;
  }

@Override
  public void configure(ResourceServerSecurityConfigurer resources) {
    resources.resourceId(this.resourceId);
}

  @Override
  public void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        .csrf()
        .disable()
        .authorizeRequests()
        .antMatchers("/swagger-ui.html", "/webjars/**", "/swagger-resources/**", "/**/api-docs/**", "/actuator/**")
        .permitAll()
        .and()
        .authorizeRequests().anyRequest().fullyAuthenticated();
  }

Проблема в том, что когда я пытаюсь получить доступ к утверждениям внутри контроллера, они не доступны. Я проверил метод extractAuthentication по умолчанию из DefaultAccessTokenConverter, внутри Spring Spring, и действительно, он игнорирует все утверждения, отличные от заданных по умолчанию. Мне в голову приходит создание нового конвертера, расширяющего конвертер DefaultAccessToken, следующим образом:

@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {

  @Override
  public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
    OAuth2Authentication authentication = super.extractAuthentication(claims);
    authentication.setDetails(claims);
    return authentication;
  }
}

Но я не выяснил, куда вводить или ссылаться на этот новый конвертер.

1 Ответ

0 голосов
/ 30 июня 2019

К сожалению, автоконфигурация Spring Boot , похоже, не обеспечивает способ замены DefaultAccessTokenConverter, который является стандартным конвертером токенов в RemoteTokenServices. Чтобы заменить конвертер, вам придется заменить RemoteTokenServices, созданный по умолчанию.

Если ваш конвертер является бобом, вы можете установить его на свой RemoteTokenServices объект, который затем можете установить на ResourceServerSecurityConfigurer (чтобы его можно было применить к OAuth2AuthenticationManager за кадром):

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {
    // ...

    @Autowired
    private ResourceServerProperties resource;

    @Autowired
    private CustomAccessTokenConverter customConverter;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.tokenServices(customTokenServices());
        // ..
    }

    private RemoteTokenServices customTokenServices() {
        RemoteTokenServices services = new RemoteTokenServices();
        services.setAccessTokenConverter(this.customConverter);

        // configure based on .properties file 
        services.setCheckTokenEndpointUrl(this.resource.getTokenInfoUri());
        services.setClientId(this.resource.getClientId());
        services.setClientSecret(this.resource.getClientSecret());

        return services;
    }

    // ..


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...