@PreAuthorize делает проверку не работающей для примитивного типа

#spring-boot #spring-security #spring-validator

Вопрос:

Прежде всего, это моя среда разработки.

  1. Весенняя загрузка: org.springframework.загрузка:2.5.6
  2. io.spring.управление зависимостями: 1.0.11.ВЫПУСК
  3. Весенняя безопасность: организация.каркасная работа.загрузка:пружинная загрузка-стартер-безопасность
  4. org.springframework.загрузка:пружинная загрузка-стартер-webflux
  5. котлин
  6. 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 помощью после запуска проекта.