Почему RestController не получает запрос после завершения AuthenticationFilter - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть рабочий Spring Boot с Spring Security. Все в основном работает. Чего я не понимаю, так это того, что RestController никогда не запускается после фильтра, авторизующего запрос.

Другими словами, у меня есть контроллер покоя, настроенный на прием POST-запросов из / foo / bar, и у меня настроен AuthenticationFilter для проверки учетных данных пользователей перед выполнением того, что запрашивал пользователь.

Учитывая, что мой RestController никогда не срабатывает, мне пришлось реализовать свой код в обработчике успеха, но вместо этого мой код принадлежит контроллеру.

Я попытался отладить это, пройдя по коду Spring Security, но, похоже, ничто не говорит о том, что он пропустит мой RestController.

@RestController
@RequestMapping("foo")
public class FooController {

  @PostMapping("bar") // this never executes
  public ResponseEntity<FooResponse> foobar(@RequestBody Credentials creds) {
    return new ResponseEntity<>(new FooResponse("baz"), HttpStatus.OK);
  }
}
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Bean
  public BCryptPasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
  }

  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
  }

  @Bean
  public AuthenticationFilter authenticationTokenFilter() throws Exception {

    AuthenticationFilter filter = new AuthenticationFilter();
    filter.setAuthenticationManager(authenticationManager());
    filter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandlerImpl());
    return filter;
  }

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

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    http
      .cors()
      .and()
      .csrf().disable()
      .authorizeRequests()
      .antMatchers(HttpMethod.POST, "/foo/bar").permitAll()
      .and()
      .addFilter(new AuthorizationFilter(properties, authenticationManager(), tokenService)
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);              
    }

}
public class AuthenticationFilter extends AbstractAuthenticationProcessingFilter {  

  public AuthenticationFilter() {
    super("/foo/bar"); 
  }

  @Override
  public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
    Credentials creds = new ObjectMapper().readValue(request.getInputStream(), Credentials.class);
    return getAuthenticationManager().authenticate(
                    new UsernamePasswordAuthenticationToken(
                          creds.getUsername(),
                          creds.getPassword(),
                          new ArrayList<>())
                    );      
  }
}
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
  @Override
  public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
    Authentication authentication) throws IOException, ServletException {
    // do nothing and prevent redirect to /login, /logout, etc
  }
}

1 Ответ

0 голосов
/ 11 апреля 2019

Вы используете http.cors (). Вы настроили это в другом месте? Если нет, то, вероятно, считает, что вы не прошли проверку подлинности. Проверьте эту ссылку: https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/cors.html

Я бы посоветовал вам удалить его, если вы не собираетесь его использовать

Также у вас есть пример простой конфигурации безопасности: https://www.baeldung.com/spring-security-login

С моей точки зрения, удаление cors () должно исправить вашу проблему (или правильно ее настроить :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...