2013-03-18 3 views
7

Ich habe dieses Stück CodeWo sollte die manuelle Authentifizierungslogik im Frühling Sicherheit gehen - Service-Layer oder Präsentationsebene?

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 
SecurityContext securityContext = SecurityContextHolder.getContext(); 
securityContext.setAuthentication(authentication); 
HttpSession session = request.getSession(true); 
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext); 

Dies ist, um manuell einen Benutzer im Frühjahr Sicherheit zu authentifizieren. Meine Frage ist, wo sollte ich diesen Code platzieren? Wenn ich dies in den Service-Layer lege, zwinge ich das HttpSession-Objekt in den Service-Layer zu bringen, was AFAIK schlecht ist. Ich bin mir nicht sicher, wie gut es ist, die Authentifizierungslogik in der Darstellungsschicht zu platzieren. Jeder mit irgendwelchen Einblicken?

Vielen Dank im Voraus.

+0

Erm, Servlet Filter ist Standard, haben Sie aus irgendeinem Grund absichtlich nur auf diese beiden Optionen beschränkt? – Affe

+0

also muss ich einen benutzerdefinierten Filter schreiben? Ab sofort ist es eine einfache GET-Anfrage. Ich muss die Logik in diesem Anruf berücksichtigen. – shazinltc

+0

Wenn Sie nur die Standardauthentifizierung verwenden, können Sie einfach die Feder konfigurieren, um diese für Sie zu handhaben. – benzonico

Antwort

14

Beziehen Sie sich auf die Antwort von Luke Taylor auf die Frage Best practice for getting active user's UserDetails? für die Design-Begründung für das Erstellen einer benutzerdefinierten Schnittstelle für diese Art von Dingen, während Sie Ihren Code von der Spring Security entkoppelt halten. Zum Beispiel können Sie eine Schnittstelle namens MyAuthenticator schreiben und die Implementierung schreiben und in Ihre Anwendung injizieren.

Auch wenn Ihre Spring-Sicherheitsfilter Standard sind, müssen Sie nicht auf das HttpSession-Objekt zugreifen. Framework Filter werden dafür sorgen. Sie müssen nur schreiben in Ihrer Implementierung folgende:

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 

SecurityContextHolder.getContext().setAuthentication(authentication); 

Ich würde nicht empfehlen „SPRING_SECURITY_CONTEXT“ (HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY), wie es in zukünftigen Versionen des Framework ändern kann.

+1

perfekt !! Vielen Dank :) – shazinltc

+0

Können Sie klarstellen, was Sie unter "Federsicherheitsfilter sind Standard" verstehen? – swbandit

+0

Bedeutet, dass es keine anwendungsspezifische Filteranpassung gibt, die das beeinflussen würde ... insbesondere der 'SecurityContextPersistenceFilter', der dafür verantwortlich ist,' SecurityContextHolder' zu füllen. – Ritesh

Verwandte Themen