【问题标题】:targetDomainObject is always null in PermissionEvaluator在 PermissionEvaluator 中 targetDomainObject 始终为空
【发布时间】:2017-10-11 01:27:49
【问题描述】:

我有一个来自 Spring Data 的this example 的 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 的答案中关于使接口和实现参数名称匹配的建议,我尝试在表达式和方法参数中将entity 更改为item。我不确定什么实现应该与这里的接口匹配,所以我猜是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,一切都是空的。

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

【问题讨论】:

  • 那么,当您按照参考问题接受的答案中的建议进行操作时,您发现了什么? "您还可以检查 MethodSecurityEvaluationContext.lookupVariable 方法如何与调试器一起使用。"
  • @JensSchauder 使用调试信息编辑问题

标签: spring-boot spring-security spring-data spring-data-rest spring-el


【解决方案1】:

没有查看实际代码,但是从您编写的有关调试信息的内容来看,Spring 无法找到参数名称,可能是因为来自接口并且那些未包含在字节码中默认。

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

【讨论】:

  • 就是这样。谢谢,我快疯了
猜你喜欢
  • 2018-06-30
  • 2011-09-10
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2019-07-18
  • 2019-08-18
相关资源
最近更新 更多