2012-04-03 8 views
0

Ich entwickle eine Webanwendung, die Spring Security für die Authentifizierung von Benutzern verwendet. Ich weiß, dass ich die angemeldeten Benutzer auf diese Weise erhalten kann:Welcher ist der beste Weg, um den angemeldeten Benutzer mit Federsicherheit zu erhalten?

public class SecurityUtil { 
    public static User getCurrentUser() { 
     SecurityContextHolder.getContext().getAuthentication().getPrincipal() 
    } 
} 

auf diese Weise und funktioniert gut. Die Frage ist: Welches ist der beste Weg, um auf diesen Wert zuzugreifen? Ich werde einige Beispiele machen:

1.User als Variable in der Steuerung erklärt:

public class FooController { 

    @Autowired 
    private FooService fooService; 

    private User u = SecurityUtil.getCurrentUser(); 

    @RequestMapping(...) 
    public void control() { 

     fooService.doSomething(u); 
    } 
} 

2.User als Parameter an den Dienst übergeben:

public class FooController { 

    @Autowired 
    private FooService fooService; 

    public void control() { 

     fooService.doSomething(SecurityUtil.getCurrentUser()); 
    } 
} 

3.User in die zugegriffen Service:

public class FooService { 

    public void doSomething() { 

     SecurityUtil.getCurrentUser(); 
     //Do something 
    } 
} 

Sind alle diese Beispiele gültig? Kann ich irgendjemanden von ihnen undeutlich benutzen? Es gibt einige Nachteile, von denen ich wissen sollte?

+0

Welche Version von Spring verwenden Sie? –

Antwort

2

Beispiel 1

Beispiel 1 ist nicht verwendbar, da durch Voreinstellungs-Feder bean Singleton ist, was bedeutet, dass, wenn die FooController erstellt wird, die User Variable nicht korrekt zugeordnet ist, oder es ist null. Wie andere Antworten darauf hinweisen, ist es auch nicht threadsicher.

Beispiel 2

Beispiel 2 ist mein empfohlene Weg, es zu tun, ist es mehr prüfbar in Unit-Test ist.

@RequestMapping(method = RequestMethod.GET) 
public String index(Model m, HttpSession session, Principal principal) { 
    // principal.getName() return username 
    return "XYZ"; 
} 

Beispiel 3

Beispiel 3 ist brauchbar, aber nicht leicht prüfbar und schwer zu pflegen: Aber ich würde verwenden Sie das folgende Beispiel (Frühling 3), siehe doc here empfehlen.

+0

wirklich? funktioniert dein Beispiel in Frühling 3? Ich wusste das nicht ... Es ist sehr elegant! – Fabio

+0

@Fabio, ja, es funktioniert im Frühjahr 3, siehe meine aktualisierte Antwort mit Link zur Frühjahrsdokumentation –

0

Beispiel 1 ist nicht threadsicher. Im Allgemeinen sollten Ihre Servicebohnen zustandslos sein.

Bei Beispiel 3 hängt es davon ab, wie Sie die FooService von Ihrem Controller aufrufen. Wenn dieser Aufruf die Anwendungsgrenzen überschreitet, müssen Sie sicherstellen, dass sich der Spring SecurityContext mit dem Aufruf fortpflanzt, damit er funktioniert.

Beispiel zwei sollte in allen Fällen in Ordnung sein, aber die Übergabe des aktuellen Benutzers in die Service-Methode scheint nicht die richtige Trennung von Bedenken.

Verwandte Themen