2015-04-16 19 views
10

abbiamo un lavoro Quartz/Spring Batch, che per scopi di registrazione di controllo vorremmo averlo "autenticato" come utente di sistema. Alcuni dei nostri metodi si basano sul recupero di SecurityContext per fare ciò. Le modalità di esecuzione di questo lavoro sono attendibili (o autenticate). Non vogliamo utilizzare effettivamente una password o un altro token (poiché il processo è in pratica generato sempre da quarzo).Come posso autenticare un utente di sistema per i processi pianificati in primavera?

Ho provato questo

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); 
    } 
} 

ma portato in

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

e io non sono sicuro di quello che alcuni dei parametri RunAsUserToken do (ad esempio chiave) o che cosa dovrei dandogli nei riguardi alle credenziali.

Come posso autenticare o altrimenti impostare il contesto di sicurezza come se fosse stato autenticato come questo utente?

+0

Hai guardato 'SecurityContextHolder.setContext()' –

+0

@JohnR sì, ma non sono sicuro di come ottenere correttamente il contesto creato con l'utente come ho bisogno di – xenoterracide

risposta

11

Non sono ancora sicuro di RunAsUserToken. Penso che sia destinato ad essere usato quando qualcuno è già autenticato, ma l'applicazione che cosa eseguire qualcosa come un altro utente.

I found an example of using it here.

Ma forse non ne hai davvero bisogno. Se è il caso, basta:

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

E quindi l'amministratore verrà autenticato. Inoltre, non è necessario utilizzare admin.getPassword() poiché non verrà comunque controllato.

Si noti che non è necessario creare il contesto di sicurezza: esiste già. Penso che sia ThreadLocal per impostazione predefinita.

+0

sembra che il 'UsernamePasswordAuthenticationToken' (che si mispelled?) dovrebbe essere popolato con il primo parametro come principale (ci sembra di usare userd UserDetails) per quello. – xenoterracide

+2

@xenoterracide: mi dispiace per il mispell, l'ho corretto. Hai ragione per il principale: se il resto della tua applicazione si basa su un UserDetails come principale, allora preferiresti passare direttamente la variabile admin. – baraber