2012-04-26 13 views
5

は、私は今、私はバックグラウンドタスクからこのメソッドを呼び出す必要があり Spring Security:バックグラウンドタスクで@PreAuthorizeで保護されたメソッドを呼び出す正しい方法は何ですか?

@PreAuthorize("hasRole('ROLE_ADMIN') and (#action.userId != principal.id)") 
public void execute(EditAction action) 

@PreAuthorize

で固定する方法があります。私は単純にこのコードを実行した場合 - 私は例外をキャッチ:

AuthenticationCredentialsNotFoundExceptionを:認証オブジェクトは、SecurityContextが

に見つかりませんでしたようだ、私はSecurityContextがへの認証を設定する必要があります。私はできます:

  1. バックグラウンドタスクのカスタム認証トークンを書きます。
  2. 偽のユーザーでUsernamePasswordAuthenticationTokenを使用します。
  3. バックグラウンドタスクで保護されたメソッドを使用しないでください。
  4. 他に何か?

正しい方法はありますか?

+0

いくつかのコードを表示できますか?どうやってそれを呼びますか? –

+0

これは透過的な呼び出しではなく、コマンドパターンを使用しています。 SecuredメソッドはHandlerのメソッドです。 "バックグラウンドタスク"とは、jms MessageListenerまたは@Scheduledメソッドのことです。私は、サーブレットを処理して呼び出すときに、何らかの方法で安全なメソッドを呼び出しています - アクションをディスパッチすることによって。 – Popandopolos

答えて

2

あなたが認証を登録することができますが(Webアプリケーションで使用する場合)現在のスレッドとのセッションで自分をトークン:

SecurityContextHolder.getContext().setAuthentication(token); 
session.put(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); 

あなたは限り、あなたは適切なロールを追加すると、このための標準UsernamePasswordAuthenticationTokenを使用することができます。