Это, безусловно, один из способов приблизиться к этому.В вашем примере предполагается, что вы настроили httpBasic()
аутентификацию
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.httpBasic();
}
или formLogin()
аутентификацию
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.formLogin();
}
Каждый из этих сценариев будет вставлять фильтр в фильтрцепь.Эти фильтры будут считывать имя пользователя и пароль из заголовка (http-basic) или параметров HTTP (form-login).Он принимает эти значения и создает UsernamePasswordAuthenticationToken и вызывает ваш пользовательский обработчик.
Вы также можете выполнить это полностью без специального поставщика аутентификации, просто внедрив фильтр
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.addFilter(new MyCustomFilter());
}
public static class MyCustomFilter extends OncePerRequestFilter {
public void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) {
if (<should we attempt authentication based on logic> {
try {
String username = ...
String password = ...
ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
a.authenticate(name, password);
//authentication successful return token
SecurityContextHolder
.getContext()
.setAuthentication(
new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>())
);
} catch(ApiAuthenticationException e) {
//Authentication failed maybe log it?
}
}
//continue
chain.doFilter(request, response);
}
Тысяча способов обработать скинкошка.Вы выбираете тот, который работает для вас.Подход провайдера аутентификации работает, вам просто нужно знать, что существует фильтр, который создает для вас объект UsernamePasswordAuthenticationToken
.Если вы не настроите эти фильтры, вы никогда не получите обратный вызов поставщику аутентификации.