Wie man Benutzer manuell mit Spring Security authentifiziert

Manuelles Authentifizieren von Benutzern mit Spring Security

1. Überblick

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

2. Frühling Sicherheit

Einfach ausgedrückt, enthält Spring Security die Hauptinformationen jedes authentifizierten Benutzers in einemThreadLocal - dargestellt alsAuthentication-Objekt.

Um diesesAuthentication-Objekt 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 manuell eine Authentifizierung auslösen und dann das resultierendeAuthentication-Objekt auf die aktuellenSecurityContext setzen, die vom Framework verwendet werden, um den aktuell angemeldeten Benutzer zu halten:

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

Nachdem SieAuthentication im Kontext festgelegt haben, können Sie jetzt mithilfe vonsecurityContext.getAuthentication().isAuthenticated() überprüfen, ob der aktuelle Benutzer authentifiziert ist.

3. Spring 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 delegiert es die Persistenz des Sicherheitskontexts an eine Instanz vonSecurityContextRepository, wobei standardmäßig die KlasseHttpSessionSecurityContextRepository verwendet wird.

Um die Authentifizierung für die Anforderung und damitmake it available for all subsequent requests from the client festzulegen, müssen wir dieSecurityContext, die dieAuthentication enthalten, 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 importiertesHttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY.

Es ist zu beachten, dass wirHttpSessionSecurityContextRepository nicht direkt verwenden können, da dies in Verbindung mitSecurityContextPersistenceFilter. funktioniert

Dies liegt daran, dass der Filter das Repository verwendet, um den Sicherheitskontext vor und nach der Ausführung der übrigen 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 diesem kurzen Tutorial haben wir erläutert, wie der BenutzerAuthentication im Spring Security-Kontext manuell festgelegt wird und wie er für Spring MVC-Zwecke verfügbar gemacht werden kann, wobei wir uns auf die Codebeispiele konzentriert haben, die den einfachsten Weg veranschaulichen, dies zu erreichen.

Wie immer finden sich Codebeispiele inover on GitHub.