24 Authentifizierungsmechanismen in Spring Security

Spring Security unterstützt eine Vielzahl von Authentifizierungsmechanismen, um verschiedenen Sicherheits- und Anwendungsanforderungen gerecht zu werden. Hier sind einige der gängigsten Mechanismen und ihre Funktionsweisen:

24.1 Basic Authentication

Bei der Basic Authentication sendet der Client Benutzername und Passwort mit jeder Anfrage, codiert im Authorization-Header des HTTP-Requests. Die Codierung erfolgt mit Base64, was bedeutet, dass diese Methode nicht sicher ist, wenn sie nicht über HTTPS verwendet wird. Spring Security unterstützt Basic Authentication out-of-the-box und bietet die Möglichkeit, den Benutzer gegen eine Datenbank, ein LDAP-Verzeichnis oder andere Authentifizierungsquellen zu authentifizieren.

24.2 Form-Based Authentication

Dies ist eine weit verbreitete Authentifizierungsmethode für Webanwendungen, bei der Benutzer ihre Anmeldedaten (üblicherweise Benutzername und Passwort) über ein Webformular eingeben. Spring Security handhabt den Authentifizierungsprozess durch das Überprüfen der Anmeldedaten gegen die konfigurierten Benutzerdetails und leitet den Benutzer basierend auf dem Authentifizierungserfolg um.

24.3 OAuth 2.0

OAuth 2.0 ist ein Delegationsprotokoll, das es Anwendungen ermöglicht, in einem sicheren Rahmen spezifische Zugriffsrechte auf Ressourcen des Benutzers zu erhalten, ohne dass dem Dienst die Anmeldedaten des Benutzers mitgeteilt werden müssen. Es wird häufig für Single Sign-On (SSO) Szenarien und für den Zugriff auf APIs verwendet. Spring Security bietet Unterstützung für OAuth 2.0, einschließlich des Resource Servers, des Authorization Servers und des Client Supports.

24.4 JWT (JSON Web Tokens)

JWT ist ein offener Standard (RFC 7519), der eine kompakte und selbstenthaltene Methode für die sichere Übertragung von Informationen zwischen Parteien als JSON-Objekt bietet. Diese Informationen können verifiziert und vertrauenswürdig sein, da sie digital signiert sind. JWTs können mit einem geheimen (mit dem HMAC-Algorithmus) oder einem öffentlichen/private Schlüsselpaar signiert werden. In Spring Security wird JWT oft in Verbindung mit OAuth 2.0 verwendet, um Tokens zu generieren und zu validieren.

24.5 LDAP (Lightweight Directory Access Protocol)

LDAP wird für das Lesen und Bearbeiten von Verzeichnissen über ein IP-Netzwerk verwendet und ist besonders nützlich für das Management von Benutzerinformationen in einem zentralen Verzeichnis. Spring Security bietet LDAP-Authentifizierung über spezielle LDAP-Authentifizierungsprovider.

24.6 SAML 2.0 (Security Assertion Markup Language)

SAML ist ein Standard für den Austausch von Authentifizierungs- und Autorisierungsinformationen zwischen Sicherheitsdomänen, der häufig für Enterprise Single Sign-On (SSO) verwendet wird. Spring Security bietet Unterstützung für SAML 2.0, was die Integration von SSO in Spring-Anwendungen ermöglicht.

24.7 Kerberos

Kerberos ist ein Netzwerkprotokoll, das auf dem Prinzip der Tickets basiert, um sichere Authentifizierung über unsichere Netzwerke ohne Übermittlung von Passwörtern zu ermöglichen. Spring Security bietet eine Integration für Kerberos, was besonders in Unternehmensumgebungen nützlich ist.

Jeder dieser Authentifizierungsmechanismen hat seine spezifischen Anwendungsfälle und Sicherheitsüberlegungen. Die Wahl des richtigen Mechanismus hängt von den Anforderungen Ihrer Anwendung, den Sicherheitsanforderungen und der Umgebung ab, in der Ihre Anwendung bereitgestellt wird. Spring Security’s flexible Architektur ermöglicht es Entwicklern, diese Mechanismen zu konfigurieren und anzupassen, um robuste Sicherheitslösungen zu erstellen.

24.8 Endpoint Security

Um in einer Spring-Anwendung öffentliche (public) und private Endpoints effektiv zu unterscheiden und entsprechende Sicherheitsmechanismen zu implementieren, bietet Spring Security eine Reihe von Konfigurationsmöglichkeiten. Diese ermöglichen es, bestimmte URLs oder Muster von URLs als öffentlich zugänglich zu markieren, während für andere eine Authentifizierung erforderlich ist. Hier sind einige Ansätze, wie Sie dies umsetzen können:

24.9 1. Sicherheitskonfiguration mit WebSecurityConfigurerAdapter

Durch die Erweiterung der WebSecurityConfigurerAdapter-Klasse können Sie spezifische Sicherheitseinstellungen für Ihre Anwendung definieren. Innerhalb der configure(HttpSecurity http)-Methode können Sie festlegen, welche Endpoints öffentlich zugänglich sein sollen und welche gesichert werden müssen.

24.9.1 Beispielkonfiguration

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // Aktivieren Sie CSRF-Schutz nach Bedarf. Für REST APIs könnte dies ausgeschaltet werden.
            .csrf().disable()
            // Autorisierungsanfragen konfigurieren
            .authorizeRequests()
                // Öffentliche Endpoints definieren
                .antMatchers("/public/**").permitAll()
                // Alle anderen Anfragen erfordern eine Authentifizierung
                .anyRequest().authenticated()
            .and()
            // Weitere Konfigurationen für Formularbasierte Authentifizierung oder JWT-Tokens usw.
            ;
    }
}

In diesem Beispiel sind alle Endpoints unter /public/** ohne Authentifizierung zugänglich. Alle anderen Endpoints erfordern eine Authentifizierung.

24.10 2. Annotation-basierte Sicherheit

Spring Security unterstützt auch eine feinere, methodenbasierte Sicherheitskonfiguration mit Hilfe von Annotations wie @PreAuthorize, @Secured usw.

24.10.1 Beispiel

@RestController
public class MeinController {

    @GetMapping("/public/hello")
    public String publicHello() {
        return "Hallo Welt!";
    }

    @PreAuthorize("isAuthenticated()")
    @GetMapping("/private/secret")
    public String privateSecret() {
        return "Geheime Informationen";
    }
}

Hier ist der /public/hello Endpoint für alle zugänglich, während der /private/secret Endpoint eine Authentifizierung erfordert.

24.11 3. Konfiguration über application.properties oder application.yml

Obwohl Spring Security selbst keine direkte Möglichkeit bietet, Sicherheitseinstellungen ausschließlich über application.properties oder application.yml zu definieren, können Sie externe Konfigurationen nutzen, um eigene Bedingungen oder Logik für Sicherheitseinstellungen zu implementieren.

Ein Ansatz könnte beispielsweise sein, eigene Property-Werte zu definieren und diese in der SecurityConfig zu verwenden, um dynamisch zu entscheiden, welche Endpoints gesichert werden sollen und welche nicht.

24.11.1 Beispiel für application.properties

app.public-endpoints=/public/**,/frei/**

24.11.2 Verwendung in SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.public-endpoints}")
    private String[] publicEndpoints;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers(publicEndpoints).permitAll()
                .anyRequest().authenticated()
            .and()
            // Weitere Konfigurationen
            ;
    }
}