Jak poprawnie zautoryzować administratora przez JWT?

0

Witam, mam bardzo dziwny problem którego nie rozumiem

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();

        http.exceptionHandling()
                .authenticationEntryPoint(authEntryPoint)
                .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.authorizeHttpRequests(request -> request
                .requestMatchers("/auth/login").permitAll()
                .requestMatchers("/addresses/**").hasAnyRole("ADMIN", "PLANNER", "FORWARDER", "ACCOUNTANT")
                .requestMatchers("/warehouses/**").hasAnyRole("ADMIN", "PLANNER", "FORWARDER")
                .anyRequest().authenticated());

        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

Mam w bazie danych użytkownika który ma role ADMIN.
Kiedy loguje się jako admin, i pobieram JWT token, i próbuje np dostać się do warehouses to dostaje w Postmanie błąd 401 Unauthorized.
Dla testów usunąłem te dwie liniki :

.requestMatchers("/addresses/**").hasAnyRole("ADMIN", "PLANNER", "FORWARDER", "ACCOUNTANT")
                .requestMatchers("/warehouses/**").hasAnyRole("ADMIN", "PLANNER", "FORWARDER")

i teraz do 'warehouses' czy 'addresses' i tak trzeba byc zalogowanym, ale juz po zalogowaniu, i przekazaniu tokena, bez problemu mam do tych endpointow dostep.

Nie rozumiem dlaczego tak sie dzieje, uzytkownik na ktorego sie loguje ma przypisaną role, wszystko jest ok.

0

Sprawdź token na jwt.io.
Od strony Springa możesz na debugu podejrzeć przez SecurityContext również role użytkownika, którym dobiłeś się do endpointu.

0

Header:
{
"alg": "HS512"
}

Payload:

{
"sub": "[email protected]",
"iat": 1702287180,
"exp": 1702287880
}

Dodałem też wydruki do kontrolera odpowiedzialnego za logowanie i widzę w konsoli ze zalogowany jestem jako john, i mam role ADMIN

0

W jaki sposób dostarczasz ten token w Postmanie? Pokaż dokładnego screena.

0

postmann.png

1

Sprawdzaj czy czasem czas tokena się nie skończył
Choć "exp": 1702287880 w momencie jak pisałeś był ważny jeszcze przez kilka minut.

0

Nie nie. Tutaj raczej jest inny problem.
Tak jak wspomniałem na samym początku.
Jeżeli do /warehouses mam ustawiony dostep na podstawie ról to dostaje błąd (pierwszy kod w pierwszym poście na samej górze).
Jeżeli to wyłączam i zostawiam że do /warehouses trzeba byc po prostu zalogowanym ( drugi kod z pierwszego posta), to wszystko jest ok i moge się tam dostać.

1

To jeszcze jednej rzeczy nie rozumiem: czemu role nie są zapisane w JWT? Bo to IMO standardowe podejście. Wiem, że to spring i nie należy oczekiwać logiki, ale może to jest jakiś trop.

0

Z configa to tu w sumie nic nie widać + dodajesz jwt filter przed UsernamePasswordAuthFilter, co jest hmmm, ciekawe.

0

pokaż implementacje tego filtra jwt

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