在@Query中使用hasPermission

时间:2018-03-01 20:40:24

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

我正在尝试使用自定义findAll()注释来注释Spring Data Repository @Query方法。我想在hasPermission()子句中使用Spring Security where表达式。

我初始化了SecurityEvaluationContextExtension bean,允许在SpEL中使用常见的内置安全表达式。

@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
    return new SecurityEvaluationContextExtension();
}

我正在使用自定义PermissionEvaluator实施。

@Query("select t from #{#entityName} t where 1=?#{hasPermission(filterObject, 'read') ? 1 : 0}")
Page<Stream> findAll(Pageable pageable);

我得到以下异常。似乎hasPermission由于某种原因无法访问。 hasRole工作正常。

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'filterObject' cannot be found on object of type 'java.lang.Object[]' - maybe not public?
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:226)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81)
    at org.springframework.expression.spel.ast.MethodReference.getArguments(MethodReference.java:155)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:85)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:171)
    at org.springframework.expression.spel.ast.Ternary.getValueInternal(Ternary.java:51)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:132)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:297)
    at org.springframework.data.jpa.repository.query.SpelExpressionStringQueryParameterBinder.evaluateExpression(SpelExpressionStringQueryParameterBinder.java:139)

hasPermission的SpEL表达式中使用@Query的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

这里的问题是filterObject实际上是您的存储库方法返回的Page实例

要使用它,应该做类似的事情

@Query("select t from #{#entityName} t where 1=?#{hasPermission(entity, 'read') ? 1 : 0}")
Page<Stream> findAll(Pageable pageable);

其中实体等于您的查询返回的实例。

可悲的是,目前看来这不可能。我还在搜索