Własna implementacja AuthenticationProvider'a - jak ją użyć?

0

Chce dodać security do aplikacji i przy okazji poznać dokładnie co się dzieje pod spodem. Napisałem więc podstawową konfigurację i chciałem się przedebugować, zobaczyć co kiedy jest wołane.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(new AuthenticationProvider() {
            @Override
            public Authentication authenticate(Authentication authentication) throws AuthenticationException {
                return authentication;
            }

            @Override
            public boolean supports(Class<?> aClass) {
                return true;
            }
        });
    }
}

Strzelam więc pod jakiś losowy endpoint, oczekuje że aplikacja zatrzyma się na tych breakpointach

screenshot-20201030213815.png

Ale nic się takiego nie dzieje, dostaję po prostu 403.
Dlaczego? Wiem, że koniec końców i tak autentykacja się nie uda z taką implementacją, ale czego brakuje by request przeszedł przez tego AuthenticationProvidera?

0

A nie masz jakiś tam logów w konsoli?
Domyślam się że pewnie crsf, może jak zrobisz

http.authorizeRequests()
            .anyRequest()
            .authenticated()
            .csrf()
           .disabled()'

to zadziała
PS raczej to kiepska metoda żeby próbowac na pałe, poczytaj dokumentacje, i jak chcesz dogłębniej wiedzieć to również to

I jeszcze jest prezentacja, sprzed 3 lat ale sam core tak bardzo się nie zmienił

0

Znalazłem chyba nieco inne rozwiązanie, wygląda prościej niż to co na większości tutoriali. Oczywiście muszę dorzucić faktyczną implementację tego filtra jeszcze.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.addFilterAfter(new JwtSecurityFilter(), SecurityContextPersistenceFilter.class);
        http.csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests().anyRequest().authenticated();
    }
}

Podczas gdy mój JwtSecurityFilter robi całą robotę

@Component
public class JwtSecurityFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        final var authentication = new CustomAuth();
        SecurityContextHolder.getContext().setAuthentication(authentication);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
0

Niestety mam wrażenie że w ogóle nie wiesz co robisz i robisz metoda copy paste. Czytałeś jakąś dokumentację tego?
Wiesz że JWT to tylko jedna z metod uwierzytelniania?

0

Tak, wiem że to tylko jedna z metod uwierzytelnienia.
I o ile konfigurowałem już security metodą copy paste jak mówisz (stąd też coś pamiętam z tych tutoriali), to w tym przypadku doszedłem do tego sam, tzn. z pomocą właśnie dokumentacji i debugwania się przez kolejne filtry.

        http.addFilterAfter(new JwtSecurityFilter(), SecurityContextPersistenceFilter.class);

Mój filtr dodany po SecurityContextPersistenceFilter bo

This filter MUST be executed BEFORE any authentication processing mechanisms. Authentication processing mechanisms (e.g. BASIC, CAS processing filters etc) expect the SecurityContextHolder to contain a valid SecurityContext by the time they execute.

  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

Sesja mi do niczego nie potrzebna, a dodanie tego do konfiguracji powoduje że nie odpala się kolejny z filtrów który nadpisuje SecurityContext.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0