#spring-boot #spring-security #spring-validator
Вопрос:
Прежде всего, это моя среда разработки.
- Весенняя загрузка: org.springframework.загрузка:2.5.6
- io.spring.управление зависимостями: 1.0.11.ВЫПУСК
- Весенняя безопасность: организация.каркасная работа.загрузка:пружинная загрузка-стартер-безопасность
- org.springframework.загрузка:пружинная загрузка-стартер-webflux
- котлин
- org.springframework.boot:пружинная загрузка-запуск-проверка
Когда я вызываю этот api с недопустимым значением предела(как 100), валидатор(@Max) успешно работает.
Call: GET {{apiEndpoint}}/workspaces/{{workspaceId}}/test?limit=1000
Код
@GetMapping("/test")
@ResponseStatus(HttpStatus.OK)
suspend fun test(
auth: AuthToken,
@PathVariable workspaceId: String,
@RequestParam(name = "limit", defaultValue = "15") @Max(20) limit: Int
): String {
return "OK"
}
Ответ
HTTP/1.1 500 Internal Server Error
requestId: 32511EB3433F4D1DBEAC56641E6BE1A2
Content-Type: application/json
Content-Length: 213
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
Referrer-Policy: no-referrer
{
"requestId": "32511EB3433F4D1DBEAC56641E6BE1A2",
"message": "test.limit: 20 이하여야 합니다",
"sys": {
"id": "UnhandledError",
"code": "50001",
"type": "Error"
},
"details": {
"exception": "ConstraintViolationException"
}
}
Но с аннотацией @PreAutorize валидатор не работает.
Код
@GetMapping("/test")
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('USER')")
suspend fun test(
auth: AuthToken,
@PathVariable workspaceId: String,
@RequestParam(name = "limit", defaultValue = "15") @Max(20) limit: Int
): String {
return "OK"
}
Ответ
HTTP/1.1 200 OK
requestId: B0F832B0AACA49DDB2F5774FE3BFB8D4
Content-Type: application/json;charset=utf8
Content-Length: 2
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
Referrer-Policy: no-referrer
OK
Почему spring-security делает валидатор неработоспособным??
Кроме того, валидатор для типа объекта(не примитивного типа) успешно работает с @PreAuthorize.
@PostMapping("/test")
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("hasRole('USER')")
suspend fun test(
auth: AuthToken,
@PathVariable workspaceId: String,
@RequestBody @Valid body: Payload // It works!!
): String {
return "OK"
}
data class Payload(
@field:Max(10)
val age: Int
)
Пожалуйста, помогите мне.
Я также пытался использовать » группы(группы проверки)», но это тоже не работает.
Комментарии:
1. Можете ли вы попробовать добавить
@Validated
аннотацию в свой класс контроллера?2. У всех контроллеров уже
@Validated
есть аннотации. Если я удалю@PreAuthorize
аннотацию,@Max()
она будет успешно работать. Я думаю@PreAuthorize
, что проверка аргументов не работает.3. Если
@PreAuthorize
не существует,org.springframework.validation.beanvalidation.MethodValidationInterceptor::invoke()
вызывается для проверки параметров, но существует метод, который никогда не вызывался.4. Можете ли вы создать проблему в репозитории Spring Security на GitHub со ссылкой на воспроизводимый образец? Этот сценарий может быть ошибкой
5. github.com/und3rs/springboot-helpme Вы можете протестировать с
srctestkotlintest.http
помощью после запуска проекта.