gpt4 book ai didi

spring-security - 在@Query 中使用 hasPermission

转载 作者:行者123 更新时间:2023-12-04 07:13:47 24 4
gpt4 key购买 nike

我正在尝试注释 Spring Data Repository findAll()具有自定义的方法 @Query注解。我想使用 Spring Security hasPermission() 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@Query 中的 SpEL 表达式中?

最佳答案

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

为了能够使用它,应该做类似的事情

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

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

可悲的是,目前似乎不可能。我还在寻找

关于spring-security - 在@Query 中使用 hasPermission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49058363/

24 4 0