Spring Boot Security - Unautorized 401 - konfiguracja nie działa.

0

Chcę dodać do aplikacji uprawnienia dostępu do zasobu/ów.
Po ustawieniu własnej konfiguracji, w postmanie otrzymuję 401.
Wywołuję endpoint zwracający klienta po PESELU:
http://localhost:9070/api/customer/96112701500
Konfiguracja:

@Configuration
@RequiredArgsConstructor
@Order(1)
public class ModSecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
                .antMatchers("/api/orders/**", "/api/customer/**")
                .and()
                .httpBasic()
                .and()
                .authorizeRequests()
                .anyRequest()
                .hasRole("MOD")
                .and()
                .csrf()
                .disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("SELECT e.login,e.password,e.enabled FROM rc_employee e WHERE e.login = ?")
                .authoritiesByUsernameQuery("SELECT rc_employee.login, auth.name" +
                        "FROM rc_authority auth" +
                        "INNER JOIN rc_employee_rc_authority emp_auth ON emp_auth.id_rc_authority = auth.id_rc_authority" +
                        "INNER JOIN rc_employee ON rc_employee.id_rc_employee = emp_auth.id_rc_employee" +
                        "WHERE rc_employee.login = ?");
    }
}

Powyższe zapytania SQL (usersByUsernameQuery, authoritiesByUsernameQuery), sprawdziłem bezpośrednio w bazie danych (pracuję na Oraclu) i otrzymuję oczekiwane wyniki:
screenshot-20210102112554.png

screenshot-20210102112716.png

Po uruchomieniu aplikacji, podaniu w postmanie loginu USER1 i hasła pwd i wywołaniu GET na wspomnianym endpoincie w konsoli otrzymuję:
screenshot-20210102113426.png

Do hasła użyłem bcrypt. Dodałem odpowiedniego beana w pliku uruchomieniowym:

@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder(6);
	}
	public static void main(String[] args) {
		SpringApplication.run(RentcarApplication.class, args);
	}
}

Nie mam pomysłu na to jak sprawdzić dlaczego nie otrzymuję dostępu do zasobu. Podpowiecie?

EDIT:
Dodam tylko że nawet ja celowo usunę jeden parametr z pierwszego zapytania SQL czyli:

.usersByUsernameQuery("SELECT e.login,e.password FROM rc_employee e WHERE e.login = ?")

Debuger nie zwraca błędu że metoda powinna przyjmować 3 elementy. Podejrzewam że zapytanie w ogóle się nie wykonuje....

2

Zdaje się że jdbcAuthentication() produkuje JdbcDaoImpl więz możesz zdebugować czy zapytanie się wywołuje. Pytanie czemu nie chcesz normalnie zaimplementować UserDetailsService którego mógłbyś łatwo przetestować?

3

@Dazon: tak po pierwsze to query masz złe.

.authoritiesByUsernameQuery(
"SELECT rc_employee.login, auth.name" +
                        "FROM rc_authority auth" +
                        "INNER JOIN rc_employee_rc_authority emp_auth ON emp_auth.id_rc_authority = auth.id_rc_authority" +
                        "INNER JOIN rc_employee ON rc_employee.id_rc_employee = emp_auth.id_rc_employee" +
                        "WHERE rc_employee.login = ?"

daje:

SELECT rc_employee.login, auth.nameFROM rc_authority authINNER JOIN rc_employee_rc_authority emp_auth ON emp_auth.id_rc_authority = auth.id_rc_authorityINNER JOIN rc_employee ON rc_employee.id_rc_employee = emp_auth.id_rc_employeeWHERE rc_employee.login = ?

Sprawdź to najpierw.

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