@PreAuthorize 注释以错误的方式解析最后一个变量

Posted

技术标签:

【中文标题】@PreAuthorize 注释以错误的方式解析最后一个变量【英文标题】:@PreAuthorize annotation resolve last variable with wrong way 【发布时间】:2021-08-30 23:13:02 【问题描述】:

我正在使用“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

最后一个变量包含值和函数(deleteProject 的'body')。 所以变量类型是对象数组

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 吗?

请帮助我。 谢谢。

【问题讨论】:

【参考方案1】:

我也有同样的问题。

org/springframework/context/expression/MethodBasedEvaluationContext.java 第 71 行 lazyLoadArguments 会将 KCallables$callSuspend 附加到最后一个元素。 我的临时解决方案是进行类型检查....

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于@PreAuthorize 注释以错误的方式解析最后一个变量的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:如果缺少 @PreAuthorize 注释,则拒绝访问控制器方法

使用自定义 bean 测试 PreAuthorize 注释

Spring Security:方法不受 @PreAuthorize 注释的保护

@PreAuthorize 注释不起作用弹簧安全性

如何在@PreAuthorize注释中传递调用自定义方法的spring句柄

如何对 Spring Security @PreAuthorize(hasRole) 进行单元测试?