2015-04-16 3 views
10

У нас есть задание 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 сделать (например, ключ) или то, что я должен отдавать ее в отношении к учетным данным.

Как я могу аутентифицировать или иным образом устанавливать контекст безопасности, как если бы он был аутентифицирован как этот пользователь?

+0

Вы смотрели на 'SecurityContextHolder.setContext()' –

+0

@JohnR да, но я не уверен, как правильно получить контекст установить с пользователем, как мне нужно – xenoterracide

ответ

11

Я еще не уверен в RunAsUserToken. Я думаю, что он предназначен для использования, когда кто-то уже прошел проверку подлинности, но приложение, чтобы выполнить что-то в качестве другого пользователя.

I found an example of using it here.

Но, может быть, вам это действительно не нужно. Если это так, вы можете просто:

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

И тогда администратор будет аутентифицирован. Кроме того, вам не нужно использовать admin.getPassword(), так как он не будет проверен в любом случае.

Обратите внимание, что вам не нужно создавать контекст безопасности: он уже существует. По-моему, это ThreadLocal.

+0

кажется, что 'UsernamePasswordAuthenticationToken' (который вам mispelled?) должен быть заполнен первым параметром, являющимся основным (мы, похоже, используем userd UserDetails) для этого. – xenoterracide

+2

@xenoterracide: Извините за неправильное право, я исправил его. Вы правы для принципала: если остальная часть вашего приложения полагается на UserDetails в качестве принципала, то вы предпочтете передать переменную admin непосредственно. – baraber