ResponseStatusException никогда не возвращается обратно пользователю - PullRequest
0 голосов
/ 01 января 2019

У меня есть API-интерфейс Spring Boot Rest, который выполняет некоторую фильтрацию проверки, прежде чем разрешить запрос запрашиваемому методу.Когда он добирается до запрошенной конечной точки, я выполняю некоторую проверку данных, отправляемых на сервер, и хочу вернуть ответ BAD REQUEST, если данные не отформатированы должным образом.Однако попытка выбросить Springs ResponseStatusException не работает, вместо этого он всегда возвращает 403 Forbidden, и я понятия не имею, почему.

@Configuration
@EnableWebSecurity
@Slf4j
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
JWTUtility jwtUtility;
@Autowired
UserRepository repository;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .addFilter(new JWTAuthenticationFilter(authenticationManager(), jwtUtility, repository))
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

@Override
public void configure(WebSecurity web) throws Exception {
    web
            .ignoring()
            .antMatchers(HttpMethod.POST, "/users");
}
}

.

@RestController
@RequestMapping("/users")
@Slf4j
public class UserController {
private final UserRepository repository;
private final Pbkdf2PasswordEncoder passwordEncoder;

UserController(UserRepository repository, Pbkdf2PasswordEncoder passwordEncoder, JWTUtility jwtUtility) {
    this.repository = repository;
    this.passwordEncoder = passwordEncoder;
    this.jwtUtility = jwtUtility;
}

@PostMapping
User create(@RequestBody User user) {
    if (user.getFirstName() == null || user.getFirstName().isEmpty()
            || user.getLastName() == null || user.getLastName().isEmpty()
            || user.getEmail() == null || user.getEmail().isEmpty()
            || user.getDisplayName() == null || user.getDisplayName().isEmpty()
            || user.getPassword() == null || user.getPassword().isEmpty()) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "First name, last name, email, display name, and password must be provided when creating a new user.");
    }
    if (repository.findByEmail(user.getEmail()) != null) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "A user with that email already exists");
    }
    if (repository.findByDisplayName(user.getDisplayName()) != null) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "A user with that display name already exists");
    }

    user.setId(0);
    user.setPassword(passwordEncoder.encode(user.getPassword()));

    repository.save(user);

    return user;
}
}

Я бы ожидал неверный запросчтобы вернуть его пользователю с описанием, которое я предоставил.Весна перехватывает это где-нибудь?И как я могу это остановить.

1 Ответ

0 голосов
/ 01 января 2019

Оказывается, это была проблема с конфигурацией безопасности, хотя в конфигурации веб-безопасности у меня игнорировалась конечная точка /users, что позволяло передавать запрос методу, по-видимому, выбрасывая исключение в этом методе, что приводило к безопасности http.включил и перехватил его.

Поэтому, изменив мою безопасность http таким образом,

http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/users").permitAll()
                .and()
                .addFilter(new JWTAuthenticationFilter(authenticationManager(), jwtUtility, repository))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

решил проблему.Странно, что он ведет себя так, поскольку, если запрос выполнен успешно и мне не нужно выдавать исключение, пользовательский объект возвращается просто отлично.Похоже, что исключение привело к тому, что оно обратило внимание не только на безопасность в сети, но и на безопасность http.

...