モジュール式に構築されたSpring MVC Webアプリケーションがあります。http
Web サイトに追加された各モジュールは、ユーザー認証のために(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
。