Spring Security @PreAuthorize注解读取Kotlin挂起函数末尾参数异常
问题结论
该问题不属于Spring Security原生Bug,本质是Kotlin挂起函数编译特性与低版本Spring Security参数解析逻辑的适配问题。
原因说明
Kotlin的suspend函数编译时会自动在方法参数列表末尾插入一个Continuation类型的隐含参数,用于实现协程状态流转。你所使用的SpringBoot 2.5.0对应Spring Security版本尚未完成Kotlin挂起函数的全适配,当需要读取的参数刚好位于方法声明的参数列表末尾时,Spring Security的参数名称解析器会将编译后新增的Continuation参数和你声明的末尾业务参数绑定到一起,最终解析为包含实际值和续体对象的Object数组,就是你调试时看到的异常结果。
解决方案
- 升级依赖版本:将SpringBoot升级至2.6.0及以上版本,对应版本的Spring Security已内置Kotlin挂起函数适配逻辑,会自动过滤编译插入的
Continuation隐含参数,不会和业务参数绑定冲突。 - 参数顺序调整:如果暂时无法升级版本,调整业务参数顺序,不要把需要在
@PreAuthorize中引用的参数放在方法参数列表最后一位即可规避该问题。 - 显式绑定参数:给需要在权限注解中读取的参数添加
@Param("参数名")注解,强制Spring Security按显式指定的名称绑定参数,不受隐含参数干扰。
内容的提问来源于stack exchange,提问作者unD3R
相关产品推荐
相关产品推荐

