Spring 当不存在安全API的身份验证时,请求正文为空

Spring 当不存在安全API的身份验证时,请求正文为空,spring,spring-security,basic-authentication,spring-webflux,spring-kotlin,Spring,Spring Security,Basic Authentication,Spring Webflux,Spring Kotlin,我正在尝试将请求主体记录在一个由spring security保护的spring引导反应式应用程序中的所有请求上。但我遇到了一个问题,即只有在存在基本身份验证头的情况下才会记录请求主体(即使用户名和密码无效)。但是,如果不存在auth标头,则不会记录请求正文。我不确定我遗漏了什么,我想知道在没有身份验证头的情况下,我如何才能访问请求主体 使用httpbasicsec上设置的身份验证入口点记录请求正文。安全配置如下所示: @Configuration @EnableWebFluxSecurity

我正在尝试将请求主体记录在一个由spring security保护的spring引导反应式应用程序中的所有请求上。但我遇到了一个问题,即只有在存在基本身份验证头的情况下才会记录请求主体(即使用户名和密码无效)。但是,如果不存在auth标头,则不会记录请求正文。我不确定我遗漏了什么,我想知道在没有身份验证头的情况下,我如何才能访问请求主体

使用
httpbasicsec
上设置的身份验证入口点记录请求正文。安全配置如下所示:

@Configuration
@EnableWebFluxSecurity
class SecurityConfiguration {

    private val logger = LoggerFactory.getLogger(this::class.java)

    @Bean
    fun securityConfigurationBean(http: ServerHttpSecurity) =
        http.csrf().disable()
                .cors().disable()
                .httpBasic()
                .authenticationEntryPoint { exchange, _ ->
                    exchange.request.body
                            .subscribe { logger.info(CharsetUtil.UTF_8.decode(it.asByteBuffer()).toString()) }
                            .let { Mono.error(HttpServerErrorException(HttpStatus.UNAUTHORIZED)) }
                }.and().authorizeExchange().anyExchange().authenticated().and().build()
}
有一个测试路由器配置具有一个路由:

@Configuration
class TestRouterConfig {

    @Bean
    fun testRoutes() =
            router {
                POST("/test") {
                    ServerResponse.ok().bodyValue("This is a test route")
                }
            }
}
当我向http:localhost:8080/test发出请求时,请求主体为

{"sample": "sample"}
由于基本身份验证标头中的用户名和密码无效,我在控制台中看到以下内容:

2019-12-06 11:51:18.175  INFO 11406 --- [ctor-http-nio-2] uration$$EnhancerBySpringCGLIB$$5b5f0067 : {"sample": "sample"}
但是,当我一起删除身份验证时,我看不到同一端点的上述日志语句(我使用rest客户机进行这些调用)

工具/框架/语言的版本:

  • 科特林:1.3.50
  • 弹簧靴:2.2.1
  • 爪哇:12
  • 梯度:5.6.4
  • Spring依赖关系管理:1.0.8.0版本
我希望能够记录导致身份验证失败(包括缺少身份验证头)的所有请求的请求主体,并希望在这方面得到任何帮助。如果已经在其他地方讨论/发布了此消息,我深表歉意


谢谢大家!

我不知道kotlin,但我认为您的问题在于,您的日志语句位于
authenticationEntryPoint
内,这是在身份验证过程启动时调用的。因此,如果您发送一个没有基本身份验证数据的请求,Spring会理解身份验证过程无法启动,并且不会进入
authenticationEntryPoint
。向这个方向调查可能是解决问题的好方法谢谢!我还尝试将authenticationFilter添加到ExceptionHandlingSpec,但似乎也没有打印正文。因此,我不知道如何连接到spring security的生态系统,以便访问请求正文。您是否尝试过addFilterBefore()?请查看此链接,如果您以某种方式解决了问题,请告诉我