2015-04-16 2 views
10

Wir haben einen Quartz/Spring Batch-Job, den wir für Audit-Logging-Zwecke gerne als Systembenutzer "authentifizieren" möchten. Einige unserer Methoden benötigen dazu den SecurityContext. Die Methoden zum Ausführen dieses Jobs sind vertrauenswürdig (oder authentifiziert). Wir wollen kein Passwort oder anderes Token verwenden (da der Prozess grundsätzlich immer von Quarz erzeugt wird).Wie kann ich einen Systembenutzer im Frühling für geplante Prozesse authentifizieren?

Ich habe versucht, diese

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

aber es führte zu

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

und ich bin mir nicht sicher, was einige RunAsUserToken Parameter tun (zB Schlüssel) oder was soll ich es in Bezug auf sein geben zu Anmeldeinformationen.

Wie kann ich den Sicherheitskontext authentifizieren oder anderweitig festlegen, als wäre er als dieser Benutzer authentifiziert?

+0

Haben Sie sich 'SecurityContextHolder.setContext()' –

+0

@JohnR ja, aber ich bin mir nicht sicher, wie man richtig den Zusammenhang mit dem Benutzer einrichten zu bekommen, wie ich zu – xenoterracide

Antwort

11

Ich bin mir noch nicht sicher über die RunAsUserToken. Ich denke, es soll verwendet werden, wenn jemand bereits authentifiziert ist, aber die Anwendung, was etwas als ein anderer Benutzer ausführen soll.

I found an example of using it here.

Aber vielleicht brauchen Sie das nicht wirklich. Wenn es der Fall ist, könnten Sie einfach tun:

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

Und dann wird der Administrator authentifiziert werden. Außerdem müssen Sie admin.getPassword() nicht verwenden, da es sowieso nicht überprüft wird.

Beachten Sie, dass Sie den Sicherheitskontext nicht erstellen müssen: er ist bereits vorhanden. Ich denke, es ist standardmäßig ThreadLocal.

+0

brauchen scheint es, dass die 'UsernamePasswordAuthenticationToken' (die Sie mispelled?) sollte mit dem ersten Parameter gefüllt werden, der der Prinzipal ist (wir scheinen userd UserDetails zu verwenden). – xenoterracide

+2

@xenoterracide: Entschuldigung für die Mispell, ich habe es korrigiert. Sie sind richtig für den Prinzipal: Wenn der Rest Ihrer Anwendung auf einen UserDetails als Prinzipal angewiesen ist, dann würden Sie lieber die Admin-Variable direkt übergeben. – baraber

Verwandte Themen