2

でカスタム<intercept-url>エクスプレッションを処理するために、カスタム エクスプレッション ハンドラを に提供しましたWebExpressionVoter。このカスタム式ハンドラーWebSecurityExpressionHandlerは と同じ方法で実装し、DefaultWebSecurityExpressionHandlerそのメソッドをオーバーライドしcreateEvaluationContextて、カスタム ルート オブジェクト セットを持つコンテキストを返します。このカスタム ルート オブジェクトはWebSecurityExpressionRoot、別のメソッドで単純に拡張されます。これは DefaultWebSecurityExpressionHandler がそれを行う方法です:

public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
        StandardEvaluationContext ctx = new StandardEvaluationContext();
        SecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
        root.setTrustResolver(trustResolver);
        root.setRoleHierarchy(roleHierarchy);
        ctx.setRootObject(root);

        return ctx;
    }

の新しいオブジェクトを作成し、WebSecurityExpressionRootそれを返す評価コンテキストのルート オブジェクトとして割り当てますが、WebSecurityExpressionRootDI の使用を禁止します (その作成は Spring によって処理されないため)。カスタム式ルートを xml ファイルに構成して、拡張子に挿入し、WebSecurityExpressionHandler注釈を使用してリソースを挿入できるようにします。

問題は、WebSecurityExpressionRootのコンストラクターへのパラメーターが動的であり、xml で Bean として指定するときに指定できないことです。WebSecurityExpressionHandlerカスタム式ルートを DIのサブクラスに挿入する方法はありますか?

4

1 に答える 1

3

-scoped BeanWebSecurityExpressionRootとして宣言し、指定されたコンストラクター引数で動的にインスタンス化できます。prototype

<bean id = "webSecurityExpressionRoot" class = "...WebSecurityExpressionRoot"
    scope = "prototype">
    ...
</bean>

.

SecurityExpressionRoot root = applicationContext.getBean(
    "webSecurityExpressionRoot", authentication, fi);

ApplicationContextWebSecurityExpressionHandlerを使用して注入できますApplicationContextAware

于 2012-04-10T15:10:54.597 に答える