2012-04-26 1 views
5

Ho un metodo fissato con @PreAuthorizeSpring Security: qual è il modo giusto per chiamare il metodo protetto con @PreAuthorize nell'attività in background?

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

Ora ho bisogno di chiamare questo metodo da un task in background. Se ho semplicemente eseguire questo codice - prendo un'eccezione:

AuthenticationCredentialsNotFoundException: Un oggetto di autenticazione non è stato trovato nel SecurityContext

Sembra, ho bisogno di impostare alcuna autenticazione a SecurityContext. Posso:

  1. Scrivere alcuni AuthenticationToken personalizzati per le attività in background.
  2. Utilizzare UsernamePasswordAuthenticationToken con un utente falso.
  3. Non utilizzare metodi protetti nelle attività in background.
  4. C'è altro?

Qual è la strada giusta?

+0

puoi mostrare qualche codice? Come lo chiami? –

+0

Questa non è una chiamata trasparente: stiamo utilizzando lo schema di comando. Il metodo protetto è un metodo di Handler. Per "task in background" intendo un jms MessageListener o un metodo @Scheduled. Sto chiamando il metodo sicuro in qualche modo, come lo chiamo processando servlet - inviando un'Azione. – Popandopolos

risposta

2

È possibile registrare un token di autenticazione da soli nel thread e sessione corrente (se usato in un'applicazione web):

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

È possibile utilizzare lo standard UsernamePasswordAuthenticationToken per questo fino a quando si aggiungono i ruoli appropriati.