Белый список пружинной загрузки - PullRequest
0 голосов
/ 04 февраля 2020

Большинство онлайн-уроков фокусируются на защищенных конечных точках, где белый список IP выходит на первое место. Таким образом, большинство из них описывают:

@Configuration
public class SomeCustom implements AuthenticationProvider {

    // initialization of ipWhitelistRange

    @Override
    public Authentication authenticate(Authentication auth) {
        WebAuthenticationDetails details = 
                           (WebAuthenticationDetails) authentication.getDetails();
        String userIp = details.getRemoteAddress();
        if(!ipWhitelistRange.contains(userIp)) {
            throw new BadCredentialsException("Invalid IP Address");
        }

        return authentication;      
    }
}

, тогда вышеупомянутое должно быть добавлено к:

@Configuration
@EnableWebSecurity
public class SomeSecurity extends WebSecurityConfigurerAdapter {
    ...
    @Autowired
    private SomeCustom authenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
       auth.authenticationProvider(authenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .anyRequest().authenticated()
          ...
    }
    ...
}

Мой пример использования заключается в том, что у меня полностью открытая конечная точка, определенная с помощью переменной пути заполнителя как /v1/something/{path}. Мой текущий SomeSecurity в основном просто .anyRequest().permitAll(), и теперь я хочу добавить ограничение диапазона IP-адресов только к одной из {path} замен. Например: /v1/something/foo, /v1/something/bar et c. должно оставаться полностью открытым, просто /v1/something/special должно быть ограничено некоторым диапазоном IP-адресов. Возможно ли указать ограничение диапазона IP-адресов для заполнителя пути или нет, это не так важно, я мог бы указать также совершенно новую конечную точку, моя проблема заключается в том, что мне не удается запустить проверку диапазона IP-адресов. Когда я добавляю .authenticated(), моя конечная точка начинает отвечать Full authentication is required to access this resource, а в режиме отладки точка останова в логах проверки диапазона IP-адресов c не останавливается.

Другими словами, как я могу вызвать проверка диапазона IP моего SomeCustom без принуждения клиента API к аутентификации с ПОЛЬЗОВАТЕЛЕМ? Я знаю, что мог бы использовать SecurityContext, чтобы получить IP-адрес пользователя и выполнить проверку вручную в своем сервисном журнале c или около того, но я бы не сказал, что это идея. Использование Spring boot 2.2.x (Spring 5.x)

РЕДАКТИРОВАТЬ: Поскольку я понял, что .authenticated() наверняка будет принудительно вводить логин пользователя, кроме ANONYMOUS, и так как я не использую никакой логин, таким образом, мой пользователь автоматически анонимный, я попробовал следующее:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/special").hasRole("ANONYMOUS")
      .anyRequest().permitAll()
}

или

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/special").anonymous()
      .anyRequest().permitAll()
}

, оба вышеперечисленных просто проходят без запуска SomeCustom поставщика белого списка IP-адресов.

Может ли быть так, что только провайдер аутентификации клиента срабатывает только при использовании неанонимного пользователя?

...