4

私は@PreAuthorizeを適用している次のインターフェースメソッドを持っています:

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

ここUserで、はHibernateエンティティオブジェクトです。それは私にエラーを与えます:

org.springframework.expression.spel.SpelEvaluationException:EL1007E:(pos 13):フィールドまたはプロパティ'id'がorg.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204)のnullで見つかりません

userアノテーションを削除し、このインターフェイスメソッドを実装するメソッドのuserの値を検査するかのように、パラメータがnullになる方法はありません。そこには、有効なUserオブジェクトが存在します。さらに、このメソッドを呼び出す直前に、ユーザーオブジェクトが正しく構築されていることを確認しました。

userSPELパーサーによってフィールドがnullと見なされる理由が本当にわかりません

4

4 に答える 4

2

Object lookupVariable(String name)メソッド内のMethodSecurityEvaluationContextで何が起こっているかをデバッガーで確認できます。

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

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

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

したがって、メソッド引数のSPEL変数への変換がSpringで非常に明確に実装されているため、 addArgumentsAsVariables()メソッドで実際に何が起こっているかを確認できます。

于 2012-05-26T18:28:55.133 に答える
1

Spring Securityは、この問題に対するより良い答えを今持っています:

http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/htmlsingle/#access-control-using-preauthorize-and-postauthorize

基本的に、<JDK 8を使用している場合は、@Pアノテーションまたは@Paramアノテーションを使用できます。

于 2014-10-08T21:09:38.083 に答える
0

LazyParamAwareEvaluationContextメソッド内loadArgsAsVariables()のバージョン3.1.0を確認できます。

インターフェイスを実装しているため、異なるエンティティに対して同じキー。

于 2012-08-24T07:33:27.093 に答える
0

タイトルが休止状態のプロパティにアクセスできないことを示しているので、これに何かを追加する必要があります。

hasPermissionには、ロードされたオブジェクトとシリアル化されたオブジェクトの2つのエディションがあります。テストケースのコードは次のとおりです。

@PreAuthorize("isAuthenticated() and hasPermission(#organization, 'edit')")
public long protectedMethod(Organization organization)
{
    return organization.getId();
}

後者の場合、ここでは、組織(休止状態のエンティティ)のIDプロパティに実際にアクセスできることがわかります。

@PreAuthorize("isAuthenticated() and hasPermission(#organization.getId(), 'organization', 'edit')")
public long protectedMethodSerializableEdtion(Organization organization)
{
    return organization.getId();
}
于 2014-10-30T09:19:16.027 に答える