Endpoint REST di accesso personalizzato

Nov 05 2020

Sto cercando di modificare l'endpoint di sicurezza di primavera POST / login predefinito per l'accesso a POST / api / users / login

Ho già provato a farlo

formLogin().loginProcessingUrl("/api/users/login")

o

formLogin().loginPage("/api/users/login")

ma non ha funzionato. Come lo faccio? Non riesco a trovare un tutorial che lo descriva o una risposta di overflow dello stack. Ho anche provato a leggere la documentazione di Spring Security ma non è stato d'aiuto.

La mia configurazione di sicurezza è simile a questa:

    private final MyUserDetailsService myUserDetailsService;

    private final PasswordEncoder passwordEncoder;

    @Override
    protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoder);
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        //go from most restrictive url to least restrictive, from single urls to /**
        httpSecurity.csrf().disable().cors().and()
                .addFilter(new JwtAuthenticationFilter(authenticationManager()))
                .addFilter(new JwtAuthorizationFilter(authenticationManager()))
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        //to allow h2 console page
        httpSecurity.headers().frameOptions().disable();
    }

Risposte

1 BassemAdas Nov 05 2020 at 03:01

Nella classe WebSecurityConfigurerAdapter c'è da configurare metodi che dovresti sovrascrivere in questo modo:

@Override
protected void configure(HttpSecurity http) throws Exception { 
   http.csrf().disable()
        .exceptionHandling()
        .authenticationEntryPoint(
                               unAuthorizedResponseAuthenticationEntryPoint)
       .and().sessionManagement()           
       .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
       .and()
       .authorizeRequests()
       .anyRequest()
       .authenticated();
    http.addFilterBefore(authenticationTokenFilter,
                          UsernamePasswordAuthenticationFilter.class);


}

@Override
public void configure(WebSecurity webSecurity) throws Exception {
    webSecurity
            .ignoring().antMatchers(HttpMethod.POST, "/api/auth/login")
            .antMatchers(HttpMethod.OPTIONS, "/**")
            .and().ignoring()
            .antMatchers(HttpMethod.GET, "/").and().ignoring();
}

}

Si prega di vedere nel metodo:

public void configure(WebSecurity webSecurity) throws Exception

la linea:

webSecurity.ignoring().antMatchers(HttpMethod.POST, "/api/auth/login")

Qui è dove metti il ​​tuo endpoint API di autenticazione personalizzato!

E poi puoi procedere come ho spiegato nella seguente domanda Come utilizzare UserDetailService personalizzato in Spring OAuth2 Resource Server?