Konfiguration von Spring Security für httpBasic Auth und jdbc Authentication.

Mr_Johnson

Aktives Mitglied
Hallo, ich bin dabei dabei ein REST Backend mit Spring und Spring Security zu entwicklen. Ich versuche vor allem in Spring Security rein zu kommen. Ich will einen Endpoint haben, bei dem Client User und Passwort schickt. Diese sollen dann über die JDBC Authentifizierungsfunktion in meiner MySql Datenbank nachgeschaut werden. Ich versuche das ganze mit einem Test zu prüfen. Ich kriege vom Test anstatt des erwarteten 200er Status immer einen 401er zurück. Ich weiß nicht was ich genau falsch mache. Bin relativ neu in Spring und dankbar für alle Tipps. Bin mir auch etwas unschlüssig, wie und wo ich am besten in Spring Security reindebugge um zu sehen was falsch läuft.

Meine Security Config:
Code:
@Configuration
@Import(DaoConfig.class)
@Order(2)
public static class HttpBasicAuthConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .jdbcAuthentication()
        .dataSource(dataSource)
        .usersByUsernameQuery("select username, password, 1 from account where username=?")
        .authoritiesByUsernameQuery("select username, 'user' from account where username=?")
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/auth/login")
        .authorizeRequests()
        .anyRequest().hasAuthority("user")
        .and().httpBasic()
        .and().csrf().disable();
    }
}
Die SQL Queries habe ich so in PHP Myadmin getestet. Funktionieren eigentlich.
Mein Testcode:
Code:
@Autowired
    private FilterChainProxy springSecurityFilterChain;
   
    private MockMvc securityMockMvc;

    @Before
    public void SetupContext() {   
        securityMockMvc = MockMvcBuilders
                .webAppContextSetup(wac)
                .addFilters(springSecurityFilterChain)
                .apply(springSecurity()).build();
    }
   
    @Test
    public void testLoginHttpBasic() throws Exception {
        MockHttpServletRequestBuilder post = post("/auth/login").with(httpBasic("frank","password"));
        securityMockMvc.perform(post).andExpect(status().isOk());
    }
 
Du gibst HTTP-Basic an, versuchst dich dann aber mit form-login einzuloggen.

Außerdem sieht dein configure auf den ersten Blick falsch aus, das dürfte eher ein
Java:
  @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatcher("/auth/login").permitAll()
           .anyRequest().hasAuthority("user")
           .and().httpBasic() //Hier dann noch mit formLogin ersetzten, wenn du eigentlich das meintest
           .and().csrf().disable();
    }
 
Hmmm... Formlogin generiert mir so eine kleine Maske zum eingeben der Anmeldedaten oder? Verstehe ich das richtig? Das wollte ich eigentlich nicht. In diesem Fall soll ja das Frontend die Daten an mein Backend schicken. Per REST Call.
 

Zurück
Oben