AOPアノテーションを使用して春にコードを挿入できますか?
-
06-07-2019 - |
質問
次のようなことをすることは可能ですか?
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コードが最良でした。逆を行い、変更する必要のあるコードに注釈を付けたい。
最終的にはメソッド内で上記のチェックを行うこともできますが、注釈の方法で追加のドキュメントが提供されるため、ユーザーはドキュメントをコードと同期させずに特定の権限が必要であることは明らかです。
解決
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.
他のヒント
あなたの「権限が不十分です」と確信しています。例は Spring AOP で実行できます。 Spring Securityの仕組み。 AroundJとAspectJを使用すると、非常に洗練されたことができます。
所属していません StackOverflow