So authentifizieren Sie Benutzer manuell mit Spring Security

1. Übersicht

In diesem kurzen Artikel konzentrieren wir uns darauf, wie Sie einen authentifizierten Benutzer in Spring Security und Spring MVC programmgesteuert festlegen.

2. Frühlingssicherheit

Einfach ausgedrückt, enthält Spring Security die Hauptinformationen jedes authentifizierten Benutzers in einem ThreadLocal - dargestellt als Authentifizierungsobjekt .

Um dieses Authentifizierungsobjekt zu erstellen und festzulegen , müssen wir denselben Ansatz verwenden, den Spring Security normalerweise verwendet, um das Objekt auf einer Standardauthentifizierung aufzubauen.

Lassen Sie uns die Authentifizierung manuell auslösen und dann das resultierende Authentifizierungsobjekt in den aktuellen SecurityContext setzen, der vom Framework verwendet wird, um den aktuell angemeldeten Benutzer zu speichern:

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

Nachdem Sie die Authentifizierung im Kontext festgelegt haben, können Sie nun mithilfe von securityContext.getAuthentication (). IsAuthenticated () überprüfen, ob der aktuelle Benutzer authentifiziert ist .

3. Feder MVC

Standardmäßig fügt Spring Security der Spring Security-Filterkette einen zusätzlichen Filter hinzu, mit dem der Sicherheitskontext ( SecurityContextPersistenceFilter- Klasse) beibehalten werden kann .

Im Gegenzug wird die Persistenz des Sicherheitskontexts an eine Instanz von SecurityContextRepository delegiert , wobei standardmäßig die Klasse HttpSessionSecurityContextRepository verwendet wird .

Um die Authentifizierung für die Anforderung festzulegen und sie daher für alle nachfolgenden Anforderungen vom Client verfügbar zu machen , müssen Sie den SecurityContext , der die Authentifizierung enthält, in der HTTP-Sitzung manuell festlegen :

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY ist ein statisch importiertes HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY .

Es ist zu beachten, dass wir das HttpSessionSecurityContextRepository nicht direkt verwenden können, da es in Verbindung mit dem SecurityContextPersistenceFilter funktioniert .

Dies liegt daran, dass der Filter das Repository verwendet, um den Sicherheitskontext vor und nach der Ausführung der restlichen definierten Filter in der Kette zu laden und zu speichern. Er verwendet jedoch einen benutzerdefinierten Wrapper für die Antwort, die an die Kette übergeben wird.

In diesem Fall sollten Sie den Klassentyp des verwendeten Wrappers kennen und ihn an die entsprechende Speichermethode im Repository übergeben.

4. Fazit

In diesen kurzen Tutorial, gingen wir darüber , wie die Benutzer manuell auf Authentifizierung im Spring Security Kontext und wie kann es für Spring MVC Zwecke zur Verfügung gestellt werden, auf den Codebeispiele zu konzentrieren , die die einfachste Art und Weise veranschaulichen , um es zu erreichen.

Codebeispiele finden Sie wie immer auf GitHub.