当前位置: 首页 > 面试题库 >

Spring安全性:为什么我们不能在@PreAuthorize中访问Hibernate实体参数?

后凯捷
2023-03-14
问题内容

我在以下接口方法上应用@PreAuthorize:

@PreAuthorize("doSomething(#user.id)")
void something(User user, List<User> accessList);

其中User是一个 hibernate实体 对象。它给我一个错误:

org.springframework.expression.spel.SpelEvaluationException:EL1007E:(pos
13):在org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204)上找不到字段或属性’id’为null

user参数不可能为null,就好像我删除了注释,并在实现此接口方法的方法中检查user的值时,那里存在一个有效的User对象。另外,在调用此方法之前,我已确保正确构造了用户对象。

我真的不知道为什么userSPEL解析器会将字段视为空


问题答案:

您可以使用调试器检查 ObjectlookupVariable(String name) 方法内的
MethodSecurityEvaluationContext中 发生了什么: __

    @Override
    public Object lookupVariable(String name) {
    Object variable = super.lookupVariable(name);

    if (variable != null) {
        return variable;
    }

    if (!argumentsAdded) {
        addArgumentsAsVariables();
        argumentsAdded = true;
    }

因此,您可以看到 addArgumentsAsVariables()
方法中真正发生的事情,因为在Spring中非常清楚地实现了将方法参数转换为SPEL变量。



 类似资料:
  • 我正在修改我以前使用的Visitor模式。我们有基类Element,它有虚拟方法接受(Visitor),并且这个方法在继承自Element的所有类中都被重写。在任何派生类中,接受()所做的就是调用visitor- 为什么客户不能直接打电话给访客- 调用元素中有哪些有用的信息。接受(访客),然后依次呼叫访客。参观(元素)?这使得Visitor模式的使用很麻烦,并且在所有元素类的层次结构中都需要额外的

  • 有人问过我这个问题。我没能给出正确的答案。你能帮我一下吗?为什么我们不能在setTimeout中访问事件(e)的值?

  • 问题内容: 有什么用的,并在Hibernate?因为我在互联网上发现的每个示例都将数据插入到单个表中,并使用两个不同的类来做到这一点。我的观点是,如果我使用单个表,那么我可以在单个类中映射所有列,那么为什么要使用不同的类。如果我们使用两个不同的表,则存在和hibernate关系。 问题答案: Hibernate 1中有两种对象。Value Object2 。实体 价值对象 是不能独立存在的对象。以

  • 假设我有一个非常简单的PHP CRUD系统来管理数据库。假设它有一个产品列表。使用Doctrine ORM,我想查询数据库并查看/编辑/添加记录。根据入门手册, 创建实体类时,所有字段都应该是受保护的或私有的(不是公共的),每个字段都有getter和setter方法(除了$id)。使用变异子可以让条令钩住调用,这些调用以一种如果直接使用entity#field=foo设置值就无法实现的方式操纵实体

  • 我这样声明了'car'对象: 当我运行该程序时,这段代码给我一个错误,它说“无法分配字段”color“,因为”car[i]“为空”: (“color”属性位于类“vehicles”中)

  • 问题内容: 我了解您无法做到,并且了解界面在Go中的工作方式。但是我主要关心的是 为什么 决定接口不能声明字段。 我什至可以看到将其添加到Go V2中的建议。 有人可以对此给出清晰的解释吗? 问题答案: 沃尔克如此准确地在评论中留下了一个原因,他说: “接口仅封装行为。数据不是行为。” 另一个更容易理解的原因是:测试。当前,接口仅指定一组行为。假设我要测试一些需要接口的代码。如果有些脚的开发人员实