java - 如何在 @Query 中使用 hasAnyRole 之类的表达式 SpEl

标签 java spring spring-security spring-data-jpa

我在 @Query 中使用 Spring Security 表达式,就像这个例子:

@Query("select o from Pet o where o.owner.name like ?#{hasRole('ROLE_ADMIN') ? '%' : principal.username}")

如果您具有 ADMIN 角色,查询将返回所有宠物。但是,如果您没有此角色,则查询仅返回所有者名称与用户身份验证名称相同的 Pet 对象。

这工作正常,但是当我尝试使用 hasAnyRole('ROLE_ADMIN','ROLE_OWNER') 时,系统返回异常...

org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 0): Method call: Method hasAnyRole(java.lang.String,java.lang.String) cannot be found on java.lang.Object[] type
at org.springframework.expression.spel.ast.MethodReference.findAccessorForMetho
...

在 SecurityExpressionRoot 中定义了 hasAnyRole 方法:

public final boolean hasAnyRole(String... roles) {
    return hasAnyAuthorityName(defaultRolePrefix, roles);
}

最佳答案

我有同样的问题,快速解决方法是编写 hasRole('ROLE_SUPER') 或 hasRole('ROLE_OWNER')

这个异常是由 Spring Data 引起的,据我在调试时所见,它无法解析 SpEL 中参数数量可变的方法。 ExtensionAwareEvaluationContextProvider 方法解析器与 hasAnyRole(String[]) 不匹配。

我创建了 https://jira.spring.io/browse/DATACMNS-1518 .

编辑:这个问题已经解决,我刚刚测试了最新的快照并让 hasAnyRole 工作。

关于java - 如何在 @Query 中使用 hasAnyRole 之类的表达式 SpEl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486538/

相关文章:

spring - Spring 型材的替代品

Java-Spring 启动 : Access-Control- Allow-Origin not working

java - JSF 2.3 整个 bean 验证会丢弃所有字段。是故意的吗?难道是我用错了什么东西?

java - Java内部类有什么用?嵌套类和内部类是一样的吗?

java - 拼图: cannot find Kotlin symbols

java - Spring Boot MongoRepository 按日期与 Criteria lt 和 gte 查询给出错误结果

java - 生成 java 类到 src 不仅以 maven cxf-codegen-plugin 为目标

spring - 如何在Spring State Machine上检索和找到当前状态?

java - Spring 安全 AngularJS 禁止 403

spring - 如何使用 Spring 安全性和 Spring 安全性对象中的属性限制对 URL 的访问?