4

次のようなことは可能ですか?

public void doStuff(@RequirePrivilege("foo") User user) {
    // ...
}

次のように効果的に実行されていますか?

public void doStuff(User user) {
    if(!user.hasPrivilege("foo"))
        throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
    // ...
}

Spring にはさまざまな種類の AOP サポートがあることは知っていますが、特定のメソッドの前または後に実行されるように注釈が付けられた AOP コードを見つけることができたのは最高でした。逆を行い、変更する必要があるコードに注釈を付けたいと思います。

最終的には、メソッド内で上記のチェックを行うだけで済みますが、注釈を使用する方法では追加のドキュメントが提供されるため、ドキュメントをコードと同期させなくても、ユーザーが特定の権限を必要としていることを明確にできます。

4

2 に答える 2

1

あなたの「不十分な権限」の例は、Spring AOPで実行できると確信しています。これは、Spring Security がそのように機能するためです。aroundアドバイスとAspectJを使用すると、非常に洗練されたことができます。

于 2009-06-19T00:46:39.430 に答える
1

アノテーションで一致するため、これを行うために AspectJ を使用することを検討できます。次に、アラウンド アスペクトを使用して、ユーザーがこのメソッドを使用するための要件を満たしているかどうかを判断できます。

Spring では AspectJ を使用できます。可能であれば、これを実行時ではなくコンパイル時に行うことをお勧めします。これは、アプリケーションを起動するたびにこのアスペクトを使用するための代価を支払う理由がないためです。しかし、実行時にそれをしなければならないのであれば、それは可能です。

AspectJ In Action ( http://www.manning.com/laddad2/ )を見たいと思うかもしれませんが、そこからの例を次に示します: 署名パターン:

* *(@RequestParam
(@Sensitive *))

説明

*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.
于 2009-09-24T01:44:43.003 に答える