Authentifizierung und Autorisierung in Java: Spring Security und JWT

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Authentifizierung und Autorisierung in Java: Spring Security und JWT



Die Organisation des sicheren Zugriffs auf Ressourcen ist eine der Hauptaufgaben bei der Entwicklung von Webanwendungen in Java. In diesem Artikel werden wir zwei grundlegende Konzepte behandeln: Authentifizierung (Überprüfung der Benutzeridentität) und Autorisierung (Überprüfung der Zugriffsrechte). Wir betrachten praktische Beispiele mit dem beliebten Framework Spring Security und der Technologie JSON Web Tokens (JWT).



1. Grundlegende Konzepte



Bevor wir zum Code übergehen, ist es wichtig, die Begriffe klar abzugrenzen:



  • Authentifizierung (Authentication) — der Prozess der Überprüfung, wer der Benutzer ist. Dies erfolgt normalerweise über Login und Passwort, Biometrie oder Token.
  • Autorisierung (Authorization) — der Prozess der Bestimmung, was der Benutzer tun darf. Zum Beispiel der Zugriff auf bestimmte API-Endpunkte oder Anwendungsfunktionen.


In modernen Java-Anwendungen wird zur Implementierung dieser Mechanismen am häufigsten die Kombination Spring Security + JWT verwendet. JWT ermöglicht es, Benutzerinformationen in einem kompakten Token zu speichern, der leicht zwischen Client und Server übertragen werden kann.



2. Konfiguration von Spring Security mit JWT



Fügen wir die erforderlichen Abhängigkeiten in die pom.xml (Maven) ein:



<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-security</artifactId></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-api</artifactId>    <version>0.12.3</version></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-impl</artifactId>    <version>0.12.3</version>    <scope>runtime</scope></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-jackson</artifactId>    <version>0.12.3</version>    <scope>runtime</scope></dependency>


3. Erstellung eines Dienstes für die Arbeit mit JWT



Erstellen wir eine Klasse JwtService, die für die Generierung und Überprüfung von Token zuständig ist:



import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Service;

import javax.crypto.SecretKey;import java.util.Date;import java.util.HashMap;import java.util.Map;

@Servicepublic class JwtService {

private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final long expirationMs = 86400000; // 24 Stunden

public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); return Jwts.builder() .setClaims(claims) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expirationMs)) .signWith(secretKey) .compact(); }

public String extractUsername(String token) { return extractAllClaims(token).getSubject(); }

private Claims extractAllClaims(String token) { return Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .getBody(); }

public boolean isTokenValid(String token, String username) { final String extractedUsername = extractUsername(token); return (extractedUsername.equals(username) && !isTokenExpired(token)); }

private boolean isTokenExpired(String token) { return extractAllClaims(token).getExpiration().befo

Empfehlungen