2017-06-16 11 views
3

は現在、私のAuditorAware実装は、作成/修正ユーザー名を保存するための現在の監査を取得するために、SpringのSecurityContextHolderを使用しています。非同期タスクでspring-data-jpa監査(AuditorAware)をどのように活用できますか?

@Service 
public class AuditorAwareImpl implements AuditorAware<UserDetails> { 

    private final UserDetailsService userDetailsService; 

    @Autowired 
    public AuditorAwareImpl(UserDetailsService userDetailsService){ 
     this.userDetailsService = userDetailsService; 
    } 

    @Override 
    public UserDetails getCurrentAuditor() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     return userDetailsService.loadUserByUsername(authentication.getName()); 
    } 
} 

これは春のバッチのSimpleAsyncTaskExecutorで実行される非同期タスクを除き、ほとんどの操作のために正常に動作します。 SecurityContextHolderを払拭するため、要求が処理された後、時間エンティティによって

は、保存する必要があり、asynchrnously jobLauncher.run(...)戻り、 AuditorAwareImpl.getCurrentAuditor()方法が原因ヌル getAuthentication()NullPointerExceptionがスローされます。これまでのところ

java.lang.NullPointerException: null 
    at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:31) 
    at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:18) 

私はジョブに要求を呼び出すユーザを非識別パラメータとして含めましたが、ここからどこへ進めるべきか分かりません。

SecurityContextHolderが呼び出された「監査人」を見つけるのに適していない場合、春の組み込み監査を活用するための推奨方法は何ですか?

+0

私はこの問題を解決していません。 –

+0

私はつまらないものを意味します(間違い) –

答えて

3

あなたは特別な春SecurityContextを伝播するために設計されてDelegatingSecurityContextAsyncTaskExecutorであなたのAsyncTaskExecutorをラップすることができます。また、セキュリティコンテキストのためにさらにMODE_INHERITABLETHREADLOCALを設定する必要があります。

+0

どうやってですか? –

+0

をご覧ください。https://stackoverflow.com/questions/40345643/java-future-spring-authentication-is-null-into-auditoraware – Shailendra

関連する問題