在 @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);
我得到以下异常。似乎由于某种原因无法访问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)
在@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