2011-07-05 12 views
1

私は、認証とのTimerService @Timeout注釈についての質問がある:私たちのアプリケーション・ユーザーでEJB3.1のTimerService @Timeout現在のプリンシパル

が与えられた間隔で実行するタスクをスケジュールすることができ、彼らはタスクのリストから選択各タスクは、アプリケーション内の特定のEJBに関連付けられています。ユーザーが保存ボタンを押すと、タイマーサービスに新しいタイマーが追加されます。@ Timeoutメソッドが呼び出されると、ユーザーが指定したEJBのメソッドが@Timeoutメソッドから呼び出されます。

タイムアウトメソッドTimerserviceによって使用されている場合、現在のプリンシパルは「ANONYMOUS」です。これは、timoutメソッド内から保護されたEJBを呼び出す必要がある場合に問題になります。現在のプリンシパルとロールを、タイマーを作成したユーザーと同じプリンシパルとロールに変更することは可能ですか?

@Singleton 
@LocalBean 
public class TestEJB 
{ 

    @Resource 
    SessionContext context; 
    @Resource 
    TimerService timerService; 

    @Timeout 
    public void execute(Timer timer) throws Exception { 
     //Get the current username 
     System.out.println(context.getCallerPrincipal().getName()); 
    } 

    public void createScheduledTimer(ScheduleExpression e,String timerId) throws IllegalArgumentException, IllegalStateException, EJBException { 
     TimerConfig tc = new TimerConfig(); 
     tc.setInfo(timerId); 
     tc.setPersistent(true); 
     timerService.createCalendarTimer(e, tc); 
    } 

} 

答えて

1

Glassfishでこれを行いました。私たちの場合、一般的なTimer Beanがあります.Timer Beanは、実行中のタスクごとのBeanではなく、いくつかのタスクを実行できますが、概念は同じです。

私たちがやったことは、タスクがサブミットされたときにユーザーを記録し、Glassfishの特定のProgramaticLogin機能を利用して、タイマーの開始時にユーザーを再びログインさせることです。こうすることで、EJBセキュリティコンテキスト全体がユーザーとタスクに対して適切に設定されます。

+0

@Timeout public void execute(タイマータイマー){ProgrammaticLogin programmaticLogin = new ProgrammaticLogin(); programmaticLogin.login(userName、password); – user829776

+0

こんにちは、これはちょうど私が探していたものです、私たちはglassfishについてもアプリケーションを実行しています。私はプログラムによるログインで多くの例を見つけることができませんでした。実装は以下のようになります: ProgrammaticLogin programmaticLogin =新しいProgrammaticLogin(); programmaticLogin.login(userName、password); – user829776

+0

はい、そうです。実装にはカスタムレルムを使用していることに注意してください(通常、Glassfishにはファイル、jdbc、およびLDAPレルムが付属しています)。もう一つは、レルムが検出できるパスワードの代わりに署名付きのトークンを渡して、「それは私たちのもの」を知ることができます。つまり、ユーザに実際のパスワードをプレーンテキストで知らせる必要はありません。 –

1

@RunAsを使用してください。ここで例を確認してください:http://www.shareyourwork.org/roller/ralphsjavablog/entry/using_runas_in_ejb_3

+0

こんにちは、あなたの答えをありがとう、RunAs注釈は、問題の一部を整理しますが、特定のユーザーとしてタイムアウトメソッド内からEJBを呼び出すことは可能ですか?それによって呼び出されたEJBがcontext.getCallerPrincipal()を呼び出すと、それはユーザー名を返しますか? – user829776

0

3.1ステートフルセッションBeanを使用しているので、タイマーがサポートされています。 @Singletonではなく、@Statefulと入力してください。次に、createScheduledTimerメソッドでユーザー名を取得してみてください。プライベートフィールドとして格納し、@ Timeoutメソッドでアクセスします。

+0

SFSBはタイマーをサポートしていません。 SFSBへの参照を保持できるかもしれませんが、SFSBがタイムアウトする前にタイマーが起動するかどうかによって異なります。 –

+0

3.1でサポートが追加されたと思いましたか? cronのようなスケジューリング、デプロイ時のタイマー作成、ステートフルセッションBeanのタイムドオブジェクトをサポートするためのJSR:EJB Timer Serviceの拡張機能から。 –

+1

SFSBのサポートはJSR 318の最初の提案に含まれていましたが、最終リリースでは「ステートレスセッションBean、シングルトンセッションBean、メッセージ ドリブンBean、2.1エンティティBean [94]ステートフルセッションBeanのタイマーは作成できません[95]。 –

関連する問題