xsr*_*ity 5 spring-security spring-el spring-data spring-data-jpa
我正在尝试findAll()
使用自定义@Query
注释来注释 Spring Data Repository方法。我想在hasPermission()
里面使用 Spring Security表达式where
子句中。
我已经初始化了SecurityEvaluationContextExtension
bean 以允许在 SpEL 中使用常见的内置安全表达式。
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用自定义PermissionEvaluator
实现。
@Query("select t from #{#entityName} t where 1=?#{hasPermission(filterObject, 'read') ? 1 : 0}")
Page<Stream> findAll(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
我得到以下异常。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)
Run Code Online (Sandbox Code Playgroud)
hasPermission
在 SpEL 表达式中使用的正确方法是什么@Query
?
Teo*_*ali -1
这里的问题是 filterObject 实际上是您的存储库方法返回的 Page 实例
为了能够使用它,应该做类似的事情
@Query("select t from #{#entityName} t where 1=?#{hasPermission(entity, 'read') ? 1 : 0}")
Page<Stream> findAll(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
其中实体等于查询返回的实例。
遗憾的是,目前看来还不可能。我还在寻找
归档时间: |
|
查看次数: |
592 次 |
最近记录: |