如何在@Query中使用hasAnyRole表达式SpEl

时间:2016-02-18 16:07:43

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

我在@Query中使用Spring Security Expressions,如下例所示:

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

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

这很好用,但是当我尝试使用 hasAnyRole(&#39; ROLE_ADMIN&#39;,&#39; ROLE_OWNER&#39;)时,系统会返回异常... < / p>

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);
}

1 个答案:

答案 0 :(得分:0)

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

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

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

编辑:此问题已得到解决,我刚刚测试了最新的快照并获得了hasAnyRole的支持。