簡體   English   中英

如何在Spring中為系統用戶驗證計划進程?

[英]How can I authenticate a system user for scheduled processes in Spring?

我們有一個Quartz / Spring Batch作業,為了審計日志記錄,我們希望將它作為系統用戶進行“認證”。 我們的一些方法依賴於獲取SecurityContext來執行此操作。 運行此作業的方式是可信的(或經過身份驗證)。 我們不想實際使用密碼或其他令牌(因為該過程基本上總是由石英生成)。

我試過這個

private void authenticate() {
    UserDetails admin = userDetailsService.loadUserByUsername( "admin" );

    RunAsUserToken token = new RunAsUserToken(
            UUID.randomUUID().toString(), admin, admin.getAuthorities(), null , null );

    Authentication user = authenticationManager.authenticate( token );

    if ( user.isAuthenticated() ) {
        SecurityContext sc = new SecurityContextImpl();
        sc.setAuthentication( user );
        SecurityContextHolder.setContext( sc );
    }
}

但它導致了

org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.access.intercept.RunAsUserToken

而且我不確定一些RunAsUserToken參數是做什么的(例如密鑰)或者我應該在Credentials方面提供什么。

我如何驗證或以其他方式設置安全上下文,就像它被認證為此用戶一樣?

我還不確定RunAsUserToken。 我認為它的目的是在某人已經過身份驗證時使用,但應用程序將執行某些內容作為另一個用戶。

我在這里找到了一個使用它的例子

但是,也許你真的不需要那樣。 如果是這種情況,您可以這樣做:

Authentication auth = new UsernamePasswordAuthenticationToken(admin.getUsername(), admin.getPassword(), admin.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);

然后管理員將進行身份驗證。 此外,您不需要使用admin.getPassword()因為它無論如何都不會被檢查。

請注意,您不必創建安全上下文:它已存在。 我認為默認情況下它是ThreadLocal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM