Spring Boot @PreAuthorize注解以错误的方式解析最后一个变数

eyh26e7m  于 2022-11-23  发布在  Spring
关注(0)|答案(2)|浏览(132)

我使用的是'org.springframework.security.access.prepost'的@PreAuthorize注解。
请查看我的开发环境。

- language: kotlin
- framework: SpringBoot 2.5.0
- implementation("org.springframework.boot:spring-boot-starter-webflux")
- implementation("org.springframework.boot:spring-boot-starter-security")

当我尝试访问变量***a***如下面的方式时,它工作得很好。

@PreAuthorize("hasPermission(#a, 'Document', T(io.myproject.Permission).WRITE)")
suspend fun deleteProject(@PathVariable a: String, @PathVariable b: String) {
// something
}

但是当我试图访问函数的最后一个变量时,它却走错了路。

@PreAuthorize("hasPermission(#a, 'Document', T(io.myproject.Permission).WRITE)")
suspend fun deleteProject(@PathVariable b: String, @PathVariable a: String) {
// something
}

最后一个变量包含值和函数('body 'of deleteProject)。因此变量类型为***对象数组***。

a = {Object[2]@10801}
       {String} "TheValue"
       {KCallables$callSuspend$1@12659} "Continuation at kotlin.reflect.full.KCallables.callSuspend(KCallables.kt:55)"

我在SecurityExpressionRoot.java中检查了它。

@Override
    public boolean hasPermission(Object targetId, String targetType, Object permission) {
        return this.permissionEvaluator.hasPermission(this.authentication, (Serializable) targetId, targetType,
                permission);
    }

如您所知,函数的targetId是变量***a***。
是Spring安全的bug吗?
请帮帮我。谢谢。

ivqmmu1c

ivqmmu1c1#

我也有同样的问题
第MethodBasedEvaluationContext.java71行lazyLoadArguments会将KCallables$callSuspend附加到最后一个元素。我的临时解决方案是做类型检查...

to94eoyn

to94eoyn2#

我使用自定义参数名称来实现:

@PreAuthorize("hasPermission(#z, 'Document', T(io.myproject.Permission).WRITE)")
suspend fun deleteProject(@PathVariable b: String, @Param("z") @PathVariable a: String) {
    // something
}

相关问题