Я хочу объявить параметры безопасности моего Spring @RestController
с помощью аннотирования методов, а не указывать сопоставления ANT в bean-компоненте конфигурации безопасности Spring.
Я написал нечто подобное (я использую Kotlin и Spring WebFlux ):
@RestController
open class MyController {
@GetMapping("/public")
open suspend fun public() {
...
}
@GetMapping("/private")
@RolesAllowed("user")
open suspend fun public() {
...
}
}
Я также включил глобальную защиту методов в своем классе конфигурации безопасности:
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true
)
Я хочу, чтобы первый метод мог вызываться любым (даже анонимными пользователями) и второй метод может вызываться только аутентифицированным пользователем с указанной ролью.
Но когда я вызываю приватный метод анонимным пользователем, я получаю 500 ошибок сервера и трассировку стека:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:379) ~[spring-security-core-5.3.0.RELEASE.jar:5.3.0.RELEASE]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Я хочу чтобы вернуть более релевантный код ошибки, такой как 401 или 403.