401 error вместо 400 (регистрация юзера с неуникальным username)

Рейтинг: 0Ответов: 0Опубликовано: 23.01.2023

У меня есть простой rest сервис. При попытке через постман зарегистрировать юзера с существующим юзернэйм, я должен получить 400:BAD_REQUEST, но возвращается 401:ANOUTHORIZED.

FLOW:

@Data
public class AuthenticationRequest {
    private String login;
    private String password;
}

Endpoint:

@PostMapping("/auth/signup")
public UserDTO signup(@Valid @RequestBody AuthenticationRequest request){
    return ObjectMapperUtils.map(userService.saveUser(request), UserDTO.class);
}

Сервис-слой:

public User saveUser(AuthenticationRequest request) {
    if (userRepository.findByLoginIgnoreCase(request.getLogin()).isPresent())
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, USER_EXISTS); // Fails here!
    User user = new User(request);
    user.setPassword(encoder.encode(user.getPassword()));
    userRepository.save(user);
    return user;
}

securityConfig:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .authorizeHttpRequests()
                .requestMatchers(HttpMethod.POST, "/restapi/auth/signup").permitAll()
                .anyRequest().authenticated()
            .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
                .httpBasic()
            .and()
                .csrf().disable();
    return http.build();
}

В процессе дебага я падаю в сервисном слое, где бросаю ошибку, но по flow процесс уходит в InvokationTargetException и возвращается 401. Я не понимаю, почему так.

Если изменить конфиг на ".anyRequest().permitAll()" я получаю желаемый результат, но я не хочу открывать все неописанные в конфиге ендпоинты. Есть ли другой способ, не открывая их, не падать с 401?

Ответы

Ответов пока нет.