0

モジュール式に構築されたSpring MVC Webアプリケーションがあります。httpWeb サイトに追加された各モジュールは、ユーザー認証のために(xml の名前空間を使用して) 独自のセキュリティ要素を定義できますが、これは問題なく機能しています。

現在のユーザーが特定の URL にアクセスできるかどうかをプログラムで確認する必要があります。私は検索して検索し、 への多くの参照を見つけましたWebInvocationPrivilegeEvaluator。これは素晴らしいことですが、私のアプリケーションには現在これらのうち6つがあり、どれを使用すればよいかわかりません(6つ<http:の要素があります)。6 つすべてをループして、それぞれについてチェックを実行しようとしましたが、奇妙な結果が返されます。

例:

以下を使用してすべての Bean を取得できます。

private Collection<WebInvocationPrivilegeEvaluator> privEvals;
....
privEvals = (List<WebInvocationPrivilegeEvaluator>) applicationContext.getBeansOfType(WebInvocationPrivilegeEvaluator.class).values();

そして、次のようなループチェック:

public void checkForUrl(String url) {
    for(WebInvocationPrivilegeEvaluator privEval:privEvals) {
        System.out.println(privEval.isAllowed(url, SecurityContextHolder.getContext().getAuthentication()));
    }
}

例 1: ユーザーは URL に対して承認されており、次のように出力されます:
false
false
true
true
true
true

例 2: 同じユーザーが URL に対して許可されていない場合、次のように出力されます:
false
false
true
true
true
true

しかし、URL を参照しようとすると403、2 番目の URL の正しい情報が得られます。

アップデート

WebInvocationPrivilegeEvaluatorコンテキストを受け入れる他の方法を使用すると、同じ結果が得られます。さまざまな要素でそれらを保護する多くの URL を試しhttpましたが、同じブール値が (同じ順序で) 返されます。

異なるロールが割り当てられた別のユーザーを使用すると、結果が異なる URL で常に同じになるという同じ問題が発生します (ユーザーがそれらへのアクセスを許可されている場合と許可されていない場合)、今回は次のように出力されます:
false





アップデート

タグを使用してみましたが<sec:authorize、より奇妙な結果が得られました。最初の を使用しているように見えますWebInvocationPrivilegeEvaluator

4

1 に答える 1

1

古い投稿ですが、この問題が発生し、本当の答えが見つかりませんでした。そのための私の実装は、特定のロールを使用して適切なセキュリティ レルムを選択し、レルムを認識することです。

WebInvocationPrivilegeEvaluator と FilterSecurityInterceptor の両方を取得します

    ApplicationContext context = AppContext.getApplicationContext(); 
    Map<String, WebInvocationPrivilegeEvaluator> wipes = context.getBeansOfType(WebInvocationPrivilegeEvaluator.class);
    Map<String, FilterSecurityInterceptor> filters = context.getBeansOfType(FilterSecurityInterceptor.class);

それぞれを参照し、レルムに使用される特定の ROLE で FilterSecurityInterceptor をテストします。

    for (int i = 0; i < wipes.size(); i++) {
        privilegeEvaluator=(DefaultWebInvocationPrivilegeEvaluator) wipes.values().toArray()[i];
        FilterSecurityInterceptor filter = (FilterSecurityInterceptor) filters.values().toArray()[i];
        if (filter.getSecurityMetadataSource().getAllConfigAttributes().toString().contains("hasRole('SPECIFIC_ROLE')")) return privilegeEvaluator;
    }
于 2015-08-13T10:08:08.893 に答える