在 @Query 中使用 hasPermission

Posted

技术标签:

【中文标题】在 @Query 中使用 hasPermission【英文标题】:Using hasPermission inside @Query 【发布时间】:2018-08-10 00:47:39 【问题描述】:

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

我已初始化 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);

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

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)

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

【问题讨论】:

【参考方案1】:

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

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

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

实体等于查询返回的实例。

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

【讨论】:

以上是关于在 @Query 中使用 hasPermission的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Laravel 迁移中的单个 DB::statement("Query 1; Query 2") 中使用多个 SQL 查询吗?

在 SQLiteDatabase.query() 中使用 String[] selectionArgs

在 react-query 中使用 observables

Spring数据mongo在Query中使用OR

在 Hibernate 中使用 @Query 进行带参数的本机查询

Wordpress - 在类别存档中使用 wp_query - 如何显示适当的类别?