targetDomainObject 在 PermissionEvaluator 中始终为 null

targetDomainObject is always null in PermissionEvaluator

我有一个来自 this example 的 Spring 数据的 CRUD 存储库。我正在尝试添加自定义权限评估,但在我的 PermissionEvalutor 实现中,targetDomainObject 始终是 null.

ItemRepository

@PreAuthorize("hasRole('ROLE_USER')")
public interface ItemRepository extends CrudRepository<Item, Long> {
  @PreAuthorize("hasPermission(#entity, 'DELETE')")
  <S extends Item> S save(S entity);

  @PreAuthorize("hasRole('ROLE_ADMIN')")
  void delete(Long id);
}

按照 this question 的答案中关于使接口和实现参数名称匹配的建议,我尝试在表达式和方法参数。我不确定什么实现应该匹配这里的什么接口,所以我猜是 SimpleJpaRepositoryItemRepository/CrudRepository。无论如何,它不起作用,targetDomainObject 始终为空。与另一种方法中的 targetId 相同。

调试 MethodSecurityEvaluationContext.lookupVariable 显示 args.length = 0,在方法 addArgumentsAsVariables() 内,然后记录 Unable to resolve method parameter names for method: public abstract xx.xxx.Item xx.xxx.ItemRepository.save(xx.xxx.Item). Debug symbol information is required if you are using parameter names in expressions.。在lookupVariable,一切都是空的。

调试符号不是#吗?我做错了什么?

没有查看实际代码,但从你写的调试信息来看,Spring 无法找到参数名称,可能是因为来自接口而那些不是'默认包含在字节码中。

尝试添加 -parameters 编译器标志。另请参阅此答案以了解可能类似的问题: