https://stackoverflow.com/a/44871933/173149

я есть приложение, которое использует Basic Auth и OAuth2.

Некоторые URL-адреса авторизуются с помощью Basic Auth, а "/ api / **" авторизуется с помощью OAuth2.

В настоящее время у меня есть два файла конфигурации Java (WebSecurityConfigurerAdapter а такжеResourceServerConfigurerAdapter)

Каждый из файлов конфигурации определяетpublic void configure(HttpSecurity http) метод.

Проблема в том, что мне нужен элегантный способ сообщить моему приложению, использовать ли базовую аутентификацию или oauth2 с учетом URL-запроса.

В настоящее время я используюrequestMatchers чтобы это произошло:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
  @Override
  protected void configure(HttpSecurity http) throws Exception
  {
    http
      .csrf().disable()
    .requestMatchers()
      .antMatchers("/*", "/login/**", "/reviews/**")
    .and()
    .authorizeRequests()
      .antMatchers("/*").permitAll()
      .antMatchers("/js/**").permitAll()
      .antMatchers("/img/**").permitAll()
    .formLogin()
      .loginPage("/login")
      .successHandler(loginSuccessPostHandler)
      .permitAll()
      .and()
    .logout()
      .logoutSuccessUrl("/").permitAll()
      .and()
    .apply(getSpringSocialConfigurer());
  }
}

@Configuration
public class OAuth2ServerConfig
{
  @Configuration
  @EnableResourceServer
  protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter
  {
    @Override
    public void configure(HttpSecurity http) throws Exception
    {
      http.httpBasic().disable();
      http.csrf().disable();

      http.requestMatchers()
        .antMatchers("/api/**")
        .and()
      .authorizeRequests()
        .antMatchers("/api/v1/**").access("#oauth2.hasScope('read')");  
    }
  }
}

Проблема в том, что каждый раз, когда я добавляю новый URL, который НЕ "/ api / **", мне нужно будет добавить его в мойWebSecurityConfigраздел requestMatcher ... это может привести к глупым ошибкам в будущем.

Есть ли способ сделать запрос requestMatcher на основе отрицательного регулярного выражения? Я попробовал это с помощью регулярного выражения:^(?!/api) но поскольку он на самом деле не возвращает MATCH и возвращает только «find == true», он, похоже, не выполняет свою работу.

Есть мысли / предложения?

Ответы на вопрос(2)

Ваш ответ на вопрос