Большинство онлайн-уроков фокусируются на защищенных конечных точках, где белый список 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-адресов.
Может ли быть так, что только провайдер аутентификации клиента срабатывает только при использовании неанонимного пользователя?