Расширение безопасности весны loadByUsername httpStatusCode - PullRequest
0 голосов
/ 10 октября 2019

Привет, я вынуждаю проблему, связанную с расширением функциональности метода UserDetailsService безопасности Spring. Этот метод по умолчанию генерирует исключение UsernameNotFoundException с кодом состояния 400 (неверный запрос)

    override fun loadUserByUsername(username: Username): UserDetails {
        if(loginAttemptService.isBlocked(username))
            throw TooManyInvalidLoginRequestException()
        val user = repository.findByEmail(username.toLowerCase())
            ?: repository.findByUsername(username)
            ?: throw AuthenticationUserNotFound()
        return CustomUserDetails(user)
    }

class TooManyInvalidLoginRequestException : ServiceException(TOO_MANY_REQUESTS, EMAIL_BLOCKED_TOO_MANY_INVALID_LOGIN_REQUEST)

Если я попытаюсь выбросить определенное мной исключение, которое генерирует другой код состояния, то оно переопределяется для 401 с моим сообщением. Ты хоть представляешь, как это предотвратить?

1 Ответ

1 голос
/ 10 октября 2019

Вы можете создать глобальный контроллер исключений, используя аннотацию Spring @RestControllerAdvice, что-то вроде:

import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice

data class ErrorResponseDto(erroCode: Int, message: String)

@RestControllerAdvice
class GlobalExceptionController {
    @ExceptionHandler(TooManyInvalidLoginRequestException.class)
    fun handleCaseOne(e: TooManyInvalidLoginRequestException): ResponseEntity<ErrorResponseDto> {
        val errorResponseDto = ErrorResponseDto(101, e.getMessage())
        ResponseEntity<>(errorResponseDto, HttpStatus.BAD_REQUEST)
    }

    @ExceptionHandler(SomeOtherException.class)
    fun handleCaseTwo(e: SomeOtherException): ResponseEntity<ErrorResponseDto> {
        val errorResponseDto = ErrorResponseDto(102, e.getMessage())
        ResponseEntity<>(errorResponseDto, HttpStatus.INTERNAL_SERVER_ERROR)
    }
}

Это может иметь некоторые ошибки Kotlin, это было перенесено из кода Java.

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