2

メソッド呼び出しへのアクセスを制限するメソッドを装飾するカスタム アノテーションを作成したいと思います。

私の注釈は以下のように定義されています:

@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Restrict {
   public enum RoleType {All, ROLE_A, ROLE_B, ROLE_C, ROLE_D}
   String roleLevel();
   RoleType roleType();
}

次に、次のような注釈を使用します。注釈は 2 つのパラメーターを受け取ります。1 つは必須の最小 roleType で、もう 1 つは必須の最小役割レベルです。

@Restrict(roleType = RoleType.ALL, roleLevel="user")
String deleteSomething() {
  // delete intended whatever
  return success;
}

私の意図は、上記の「deleteSomething()」メソッドのように、このアノテーションで装飾されたマネージド Bean メソッドへの呼び出しが発生すると、この呼び出しがインターセプトされ、メソッドに設定されたパラメーターがログインしたものと比較されることです。ユーザーの適切なセッション値。ログインしたユーザーのセッション ロールの値が十分に高い場合、マネージド Bean のメソッドの呼び出しが許可されます。それ以外の場合、ユーザーはリダイレクトされるか、適切なメッセージが表示されます。

私の質問はこれです。どのメソッドが呼び出されているかを「フック」して、リフレクションを通じて、メソッドに @Restrict アノテーションがあるかどうかを確認し、そのアノテーションを処理する方法はありますか。PhaseListener クラスでこれを実行しようとしましたが、リフェクションを実行するために呼び出されている Managed Bean を見つける方法がわかりません。カスタム ElResolver について読んだことがありますが、これが役立つかどうかはわかりません。また、@Restrict で注釈が付けられたメソッドがいつ呼び出されたかを何らかの方法で認識するリスナーを単純に作成する方法を見つけようとしました。

Environment Specifics:

Tomcat 6.0.35 (considering upgrading to Tomcat 7.0.27)
JSF version 2.1.7
RichFaces 4.1.0

いくつかのガイダンスと利用可能ないくつかのオプションを探しています。これを手伝ってくれる人に感謝します!

4

1 に答える 1

2

ActionListenerにグローバルとして登録されているカスタムを<action-listener>実装することで、これを実現できますfaces-config.xml

偶然にも、他の誰かが今週同じ質問をして回答しました: Custom Annotation JSF . JAAS は特定の目的では必要ないことに注意してください。通常の方法Userでセッションから を取得するだけです。FacesContext

于 2012-05-23T16:48:57.683 に答える