Хорошо, поэтому я немного взломал (вдохновленный этим ответом ), но это решило проблему для меня.
Сначала я создал это AuthenticationProvider
:
public class ClusterInternalAuthenticationProvider implements AuthenticationProvider {
public static final String USER = "...";
public static final String PASSWORD = "...";
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken)authentication;
Object principal = token.getPrincipal();
Object credentials = token.getCredentials();
if (principal.equals(USER) && credentials.equals(PASSWORD)) {
return new UsernamePasswordAuthenticationToken(
principal,
credentials,
Collections.singletonList(new SimpleGrantedAuthority("RELEVANT_AUTHORITY"))
);
}
throw new BadCredentialsException("Sorry mate, wrong credentials...");
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.isAssignableFrom(UsernamePasswordAuthenticationToken.class);
}
}
Это пробует комбо user / pswd, и если true возвращает учетные данные с правами, которые мне потребуются для доступа к определенному пути.
Далее, в SecurityConfiguration я включаю httpBasic
и добавляю свой AuthenticationProvider
:
@Override
public void configure(HttpSecurity http) throws Exception {
http
...
.and()
.authorizeRequests()
.antMatchers("my-path/**").hasAuthority("RELEVANT_AUTHORITY")
.and()
.httpBasic()
.and()
.authenticationProvider(new ClusterInternalAuthenticationProvider());
}
Кажется, этого достаточно, но это не "правильное" исправление в том смысле, что мне нужно следить за тем, чтобы не использовать эти полномочия в другом месте, и что оно кажется чрезмерным для такой небольшой потребности - другие решения очень приветствуются.