5

supports(Class clazz)メソッドではRoleVoter、常にtrueを返します。

この実装は、提示されたセキュアオブジェクトをクエリしないため、あらゆるタイプのクラスをサポートします。

この「提示された安全なオブジェクト」とは何ですか。一方、のsupports(Class clazz)メソッドは、がのサブタイプであるWebExpressionVoter場合にのみtrueを返します。ここに「提示された安全なオブジェクト」があり、なぜ有権者はそれをサポートしなければならないのですか?clazzFilterInvocationFilterInvocation

メソッドにアノテーションを使用し、投票者の1人として@Securedグローバルメソッドセキュリティ用のアクセス決定マネージャーを構成するとWebExpressionVoter、エラーが発生します

AccessDecisionManagerは、セキュアオブジェクトクラスをサポートしていません:interface org.aopalliance.intercept.MethodInvocation

これは、アクセス決定マネージャーのすべての投票者(メソッドセキュリティ用に構成されている場合)が上記のクラスをサポートする必要RoleVoterがあり、他の投票者はサポートする一方でWebExpressionVoter、のサブタイプが必要なためですFilterInvocation

SPEL@PreAuthorizeタグ内の式にもが必要WebExpressionVoterであり、クラスをサポートする必要がありますが、そうMethodInvocationではありません。しかし、それは機能します。それで、私はここで何が間違っているのですか?

4

1 に答える 1

14

secured object、保護されているものを表す要約です。、、、およびの場合、MethodInvocationまたは@Secured必要に応じて@RolesAllowed、またはその他のオブジェクトの場合があります。@PreFilter@PreAuthorizeFilterInvocation<intercept-url />

@PreFilter@PreAuthorize注釈は。によって処理されますPreInvocationAuthorizationAdviceVoter。を使用しMethodInvocationて注釈とその属性値を取得するため、次のようになります。

public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(MethodInvocation.class);
}

これWebExpressionVoterはWeb呼び出しに固有であり、URLをからのパターンと一致させるため、<intercept-url />次のようになります。

public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(FilterInvocation.class);
}

RoleVoterのみがAuthenticationオブジェクトの内容を使用するため、に依存しません。そのため、次secured objectのようになります。

public boolean supports(Class<?> clazz) {
    return true;
}

AccessDecisionManagerURLレベルのセキュリティとメソッドレベルのセキュリティを別々に設定できることに注意してください。最初の投票者はをサポートFilterInvocationし、他の投票者はをサポートしMethodInvocationます。RoleVoterまた、両方をサポートしているため、両方のコンテキストで使用できることにも注意してください。

于 2012-04-11T14:47:55.557 に答える