我使用的是'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吗?
请帮帮我。谢谢。
2条答案
按热度按时间ivqmmu1c1#
我也有同样的问题
第MethodBasedEvaluationContext.java71行lazyLoadArguments会将KCallables$callSuspend附加到最后一个元素。我的临时解决方案是做类型检查...
to94eoyn2#
我使用自定义参数名称来实现: