一尘不染

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

hibernate

我在以下接口方法上应用@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解析器会将字段视为空


阅读 357

收藏
2020-06-20

共1个答案

一尘不染

您可以使用调试器检查 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变量。

2020-06-20