1

2つの方法があるとします

 @Secured("ROLE_ADMIN")
 @RequestMapping(value = "/methodA", method = RequestMethod.GET)
 public void MethodA(){
 // code
 }

最初のメソッドを呼び出す別のメソッド

@RequestMapping(value = "/MethodB", method = RequestMethod.GET)
public void MethodB(){
MethodA();
//code
}

権限のあるアプリケーションにログインしてROLE_USERURL/methodAにアクセスしようとすると、アクセス拒否の例外が発生します。完璧です。しかし、URL/methodBにアクセスすると、Authority を使用して MethodA にアクセスしているにもかかわらず、アクセス拒否例外は発生しませんROLE_USER。それはそのように機能するはずですか、それとも私は何か間違ったことをしていますか.

PS: これはリアルタイム アプリケーションのシナリオではありませんが、コードをいじっていただけです。

4

1 に答える 1

2

これは、Spring セキュリティが保護されたクラスをプロキシすることによって機能するためです。これは、既存のクラスにラッパーを配置することを意味します。これは、インターフェース・ベースのプロキシーを使用している場合は java.lang.Proxy にするか、cglib 拡張サブクラスにすることができます。ただし、ここではあまり深く入りたくありません。

しかし、肝心なのは、外部の呼び出し元がメソッドの 1 つを呼び出すと、次のようになるということです。

呼び出し元 ---> プロキシ ---> セキュリティ インターセプタ ---> 実装クラス

アノテーションを検査し、適用するセキュリティを決定するのはセキュリティ インターセプターです。ただし、実際の実装クラスに入ると、プロキシとセキュリティ インターセプタが関与せずにメソッドを呼び出すだけなので、セキュリティ チェックは行われません。

そのため、適切な @Secured アノテーションと、内部で呼び出されるものを使用して、各エントリ ポイントを保護する必要があります。

于 2012-08-23T04:36:10.690 に答える