2012-04-26 9 views
5

que tienen un método asegurado con @PreAuthorizeSpring Security: ¿Cuál es la forma correcta de llamar al método asegurado con @PreAuthorize en la tarea en segundo plano?

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

Ahora tengo que llamar a este método de una tarea en segundo plano. Si sólo tiene que ejecutar este código - Cojo una excepción:

AuthenticationCredentialsNotFoundException: Un objeto de autenticación no se encontró en el SecurityContext

Parece, tengo que configurar ningún tipo de autenticación a SecurityContext. Puedo:

  1. Escribir un AuthenticationToken personalizado para las tareas en segundo plano.
  2. Use UsernamePasswordAuthenticationToken con el usuario falso.
  3. No utilice métodos seguros en tareas en segundo plano.
  4. ¿Algo más?

¿Cuál es el camino correcto?

+0

¿Puedes mostrar algún código? ¿Cómo lo llamas? –

+0

Esta no es una llamada transparente; estamos usando un patrón de comando. El método seguro es un método de Handler. Por una "tarea en segundo plano" me refiero a un MessageListener jms o algún método @Scheduled. Estoy llamando al método seguro de alguna manera, como lo llamo procesando servlet, despachando una Acción. – Popandopolos

Respuesta

2

Puede registrar un token de autenticación a sí mismo en el hilo y la sesión actual (si se utiliza en una aplicación web):

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

Usted puede utilizar el estándar UsernamePasswordAuthenticationToken para esto siempre y cuando se agrega las funciones apropiadas.

Cuestiones relacionadas