38 Anhang

38.1 Exkurs zu Annotationen in Java

Annotationen in Java sind Metadaten, die Informationen über die Struktur eines Programms bereitstellen. Sie haben keinen direkten Einfluss auf die Ausführung des Codes, können aber zur Laufzeit oder während der Kompilierungsphase von Werkzeugen und Frameworks verwendet werden, um spezifisches Verhalten zu implementieren oder zu ändern. Annotationen werden durch ein vorangestelltes At-Zeichen (@) gekennzeichnet und können an Deklarationen von Klassen, Methoden, Variablen, Parametern und sogar anderen Annotationen angebracht werden.

38.1.1 Grundlegende Nutzung von Annotationen

Annotationen in Java werden vor dem Element platziert, das sie annotieren sollen. Ein einfaches Beispiel ist die @Override-Annotation, die angibt, dass die darunterliegende Methode eine Methode der Basisklasse oder eines implementierten Interfaces überschreibt.

@Override
public String toString() {
    return "Beispielklasse";
}

38.1.2 Definieren eigener Annotationen

Zur Definition einer eigenen Annotation verwendet man das @interface-Keyword gefolgt vom Namen der Annotation. Annotationen können optional mit Elementen ausgestattet werden, die wie Methodendeklarationen aussehen, jedoch keine Parameter enthalten und keine Ausnahmen werfen dürfen.

public @interface MeineAnnotation {
    String beschreibung() default "Standardbeschreibung";
    int wert();
}

In diesem Beispiel definiert MeineAnnotation zwei Elemente: beschreibung, mit einem Standardwert, und wert, ohne Standardwert, was bedeutet, dass es beim Verwenden der Annotation angegeben werden muss.

38.1.3 Anwenden eigener Annotationen

Eigene Annotationen werden angewendet, indem man sie vor das zu annotierende Element setzt und, falls erforderlich, Werte für ihre Elemente bereitstellt.

@MeineAnnotation(beschreibung = "Eine spezifische Beschreibung", wert = 10)
public void meineMethode() {
    // Code hier
}

38.1.4 Annotationen im Spring Framework

Im Spring Framework werden Annotationen intensiv genutzt, um Dependency Injection, Transaktionsmanagement, Konfiguration und andere Aspekte der Anwendungsentwicklung zu vereinfachen. Einige der häufigsten Spring-Annotationen umfassen:

Die Verwendung von Annotationen im Spring Framework erleichtert die Konfiguration und das Management von Java-Anwendungen erheblich, indem es eine deklarative Methode zur Definition der Anwendungslogik und -infrastruktur bietet.

38.2 Plain Spring

Um eine Spring-Anwendung ohne Spring Boot zu starten, müssen Sie mehrere Schritte manuell durchführen, die Spring Boot typischerweise automatisiert. Folgendes ist erforderlich:

38.2.1 1. Abhängigkeiten einbinden

Zunächst müssen Sie die erforderlichen Spring Framework-Bibliotheken zu Ihrem Projekt hinzufügen. Dies kann durch Hinzufügen der Abhängigkeiten in Ihrer pom.xml (für Maven-Projekte) oder build.gradle (für Gradle-Projekte) geschehen. Sie benötigen mindestens spring-context für den IoC-Container.

38.2.1.1 Beispiel für Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.x</version> <!-- Ersetzen Sie x mit der neuesten Unterversion -->
    </dependency>
</dependencies>

38.2.2 2. Bean-Konfiguration

Definieren Sie Ihre Beans und die Anwendungskonfiguration. Dies kann über XML-Konfigurationsdateien, Annotationen in einer @Configuration-Klasse oder eine Kombination aus beidem erfolgen.

38.2.2.1 Beispiel für eine Java-Konfigurationsklasse:

@Configuration
public class AppConfig {
    @Bean
    public MeinService meinService() {
        return new MeinServiceImpl();
    }
}

38.2.3 3. ApplicationContext initialisieren

In Ihrer Hauptklasse oder am Einstiegspunkt Ihrer Anwendung müssen Sie eine Instanz von ApplicationContext initialisieren, die Ihre Bean-Konfigurationen lädt. Dieser Schritt ist entscheidend, da hierdurch der Spring Container gestartet wird, der Ihre Beans verwaltet.

38.2.3.1 Beispiel für die Initialisierung mit einer Java-Konfigurationsklasse:

public class Hauptklasse {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MeinService service = context.getBean(MeinService.class);
        service.ausfuehren(); // Ihre Geschäftslogik hier ausführen
    }
}

38.2.4 4. Beans verwenden

Nachdem der ApplicationContext initialisiert wurde, können Sie Beans aus dem Container abrufen und verwenden. Beans können über ihre ID oder den Klassentyp abgerufen werden. Die Nutzung von Dependency Injection (z.B. mit @Autowired) ist ebenfalls möglich, erfordert jedoch, dass die entsprechenden Klassen vom Spring Container verwaltet werden.

Diese Schritte bilden die Grundlage für die Erstellung einer Spring-Anwendung ohne Spring Boot. Während Spring Boot viele Konfigurationen und Initialisierungen automatisiert, bietet Ihnen das manuelle Setup von Spring mehr Kontrolle und Flexibilität über Ihre Anwendungskonfiguration und den Initialisierungsprozess.

38.3 Keycloak

Wenn Sie für OAuth 2.0 Keycloak als Identity und Access Management-Lösung verwenden möchten, können Sie Spring Security zusammen mit Keycloak nutzen, um eine sichere Authentifizierung und Autorisierung in Ihrer Spring-Anwendung zu implementieren. Hier ist ein grundlegender Leitfaden, wie Sie dabei vorgehen können:

38.3.1 Schritt 1: Keycloak Server einrichten

Zuerst müssen Sie Keycloak installieren und konfigurieren. Dies beinhaltet das Einrichten eines Keycloak-Servers, das Erstellen eines Realms für Ihre Anwendung und das Konfigurieren von Clients und Benutzerrollen innerhalb dieses Realms. Die Keycloak-Dokumentation bietet ausführliche Anleitungen zur Installation und Einrichtung.

38.3.2 Schritt 2: Abhängigkeiten in Spring Boot hinzufügen

Fügen Sie die erforderlichen Abhängigkeiten zu Ihrem Spring Boot-Projekt hinzu, um Spring Security und die Keycloak-Adapter zu integrieren. In Ihrer pom.xml könnten diese Abhängigkeiten etwa so aussehen:

<dependencies>
    <!-- Spring Boot Starter Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- Keycloak Spring Boot Adapter -->
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-boot-starter</artifactId>
        <version>IhreKeycloakVersion</version>
    </dependency>
</dependencies>

Stellen Sie sicher, dass Sie die passende Version des Keycloak-Starters verwenden, die mit Ihrer Keycloak-Server-Version kompatibel ist.

38.3.3 Schritt 3: Keycloak mit Spring Security konfigurieren

Konfigurieren Sie Keycloak in Ihrer Spring Boot-Anwendung durch Hinzufügen der entsprechenden Konfigurationswerte in die application.properties oder application.yml. Sie müssen mindestens die Adresse Ihres Keycloak-Servers, den Realm-Namen und die Client-Konfiguration angeben.

keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=IhrRealm
keycloak.resource=clientId
keycloak.credentials.secret=clientSecret
keycloak.bearer-only=true

38.3.4 Schritt 4: Sicherheitskonfiguration

Erstellen Sie eine Sicherheitskonfigurationsklasse, die von KeycloakWebSecurityConfigurerAdapter erbt, um die Sicherheitseinstellungen anzupassen. Dies könnte beispielsweise so aussehen:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
            .authorizeRequests()
            .antMatchers("/admin/*").hasRole("ADMIN")
            .anyRequest().permitAll();
    }

    // Weitere Konfiguration ...
}

Diese Konfiguration stellt sicher, dass nur Benutzer mit der Rolle ADMIN Zugriff auf Pfade unter /admin/ haben.

38.3.5 Schritt 5: Rollen und Benutzer in Keycloak konfigurieren

Stellen Sie sicher, dass Sie in Keycloak Benutzer und Rollen entsprechend den Sicherheitsanforderungen Ihrer Anwendung konfigurieren. Diese Rollen werden dann in der Sicherheitskonfiguration Ihrer Spring-Anwendung verwendet.

38.3.6 Schritt 6: Starten und Testen

Nachdem Sie alles konfiguriert haben, starten Sie Ihre Spring Boot-Anwendung. Sie sollten nun in der Lage sein, sich mit den Benutzeranmeldedaten, die in Keycloak konfiguriert sind, zu authentifizieren. Die Authentifizierung erfolgt über Keycloak, und Ihre Anwendung verwendet die von Keycloak bereitgestellten Tokens, um den Zugriff zu kontrollieren.

Das Integrieren von Keycloak mit Spring Security bietet eine robuste Lösung für das Management von Authentifizierungen und Autorisierungen, die leicht skaliert und an komplexe Anwendungsfälle angepasst werden kann.