About
+ ++ This application is a show-case for an Angular app consuming a REST + API through an OAuth2 BFF. +
+The following schema fragment specifies the expected content contained within this class. * - *
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="id" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- *
+ * {@code
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * }
*
*
*/
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/GetProductResponse.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/GetProductResponse.java
index f8fcaa094f..a2360d83eb 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/GetProductResponse.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/GetProductResponse.java
@@ -1,11 +1,11 @@
package com.baeldung.webservice.generated;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlType;
/**
@@ -13,17 +13,17 @@ import javax.xml.bind.annotation.XmlType;
*
* The following schema fragment specifies the expected content contained within this class. * - *
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="product" type="{http://baeldung.com/spring-boot-web-service}product"/>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- *
+ * {@code
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * }
*
*
*/
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/ObjectFactory.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/ObjectFactory.java
index 015ecc3f0a..e5877dd20b 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/ObjectFactory.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/ObjectFactory.java
@@ -1,7 +1,7 @@
package com.baeldung.webservice.generated;
-import javax.xml.bind.annotation.XmlRegistry;
+import jakarta.xml.bind.annotation.XmlRegistry;
/**
@@ -32,6 +32,8 @@ public class ObjectFactory {
/**
* Create an instance of {@link GetProductRequest }
*
+ * @return
+ * the new instance of {@link GetProductRequest }
*/
public GetProductRequest createGetProductRequest() {
return new GetProductRequest();
@@ -40,6 +42,8 @@ public class ObjectFactory {
/**
* Create an instance of {@link GetProductResponse }
*
+ * @return
+ * the new instance of {@link GetProductResponse }
*/
public GetProductResponse createGetProductResponse() {
return new GetProductResponse();
@@ -48,6 +52,8 @@ public class ObjectFactory {
/**
* Create an instance of {@link Product }
*
+ * @return
+ * the new instance of {@link Product }
*/
public Product createProduct() {
return new Product();
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/Product.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/Product.java
index 5957aa44b4..f1d62d1489 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/Product.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/Product.java
@@ -1,10 +1,10 @@
package com.baeldung.webservice.generated;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
/**
@@ -12,18 +12,18 @@ import javax.xml.bind.annotation.XmlType;
*
* The following schema fragment specifies the expected content contained within this class. * - *
- * <complexType name="product">
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="id" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- *
+ * {@code
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * }
*
*
*/
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/package-info.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/package-info.java
index 298ae9374b..fa8f2aeec5 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/package-info.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/webservice/generated/package-info.java
@@ -1,2 +1,2 @@
-@javax.xml.bind.annotation.XmlSchema(namespace = "http://baeldung.com/spring-boot-web-service", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://baeldung.com/spring-boot-web-service", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.baeldung.webservice.generated;
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java
index 2a50a646c5..d68fae9cb5 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java
@@ -4,8 +4,6 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
-import javax.annotation.PostConstruct;
-
import org.apache.http.client.utils.URIBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,6 +21,7 @@ import org.springframework.web.reactive.function.client.WebClient;
import dasniko.testcontainers.keycloak.KeycloakContainer;
import io.restassured.RestAssured;
+import jakarta.annotation.PostConstruct;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public abstract class KeycloakTestContainers {
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/webservice/ProductEndpointIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/webservice/ProductEndpointIntegrationTest.java
index edd15090b8..0d58cfde17 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/webservice/ProductEndpointIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/webservice/ProductEndpointIntegrationTest.java
@@ -15,6 +15,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.webservices.server.WebServiceServerTest;
import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.test.server.MockWebServiceClient;
import org.springframework.xml.transform.StringSource;
@@ -22,6 +23,7 @@ import org.springframework.xml.transform.StringSource;
import com.baeldung.webservice.generated.Product;
@WebServiceServerTest
+@ComponentScan("com.baeldung.webservice")
class ProductEndpointIntegrationTest {
private static final Map+ This application is a show-case for an Angular app consuming a REST API + through an OAuth2 BFF. +
`, + styles: ``, +}) +export class AboutView {} diff --git a/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/app.component.ts b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/app.component.ts new file mode 100644 index 0000000000..24ecc942df --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/app.component.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { AuthenticationComponent } from './auth/authentication.component'; + +@Component({ + selector: 'app-root', + standalone: true, + imports: [ + CommonModule, + RouterOutlet, + HttpClientModule, + AuthenticationComponent, + ], + template: `{{ message }}
`, + styles: [], +}) +export class HomeView { + message = ''; + + private userSubscription?: Subscription; + + constructor(user: UserService) { + this.userSubscription = user.valueChanges.subscribe((u) => { + this.message = u.isAuthenticated + ? `Hi ${u.name}, you are granted with ${HomeView.rolesStr(u)}.` + : 'You are not authenticated.'; + }); + } + + static rolesStr(user: User) { + if(!user?.roles?.length) { + return '[]' + } + return `["${user.roles.join('", "')}"]` + } + + ngOnDestroy() { + this.userSubscription?.unsubscribe(); + } +} diff --git a/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/navigation.component.ts b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/navigation.component.ts new file mode 100644 index 0000000000..e5432798a6 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/app/navigation.component.ts @@ -0,0 +1,30 @@ +import { Component, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-navigation', + standalone: true, + imports: [], + template: ``, + styles: ``, +}) +export class NavigationComponent { + @Input() + label!: string; + + @Input() + destination!: string[]; + + private userSubscription?: Subscription; + + constructor(private router: Router) {} + + ngOnDestroy() { + this.userSubscription?.unsubscribe(); + } + + navigate() { + this.router.navigate(this.destination); + } +} diff --git a/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/assets/.gitkeep b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/favicon.ico b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/favicon.ico new file mode 100644 index 0000000000..e2bb6fa626 Binary files /dev/null and b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/favicon.ico differ diff --git a/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/index.html b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/index.html new file mode 100644 index 0000000000..ed8ba6954f --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-bff/angular-ui/src/index.html @@ -0,0 +1,13 @@ + + + + ++ This application is a show-case for an Angular app consuming a REST + API through an OAuth2 BFF. +
+{message}
+This application is a show-case for an Angular app consuming a REST API + through an OAuth2 BFF.
+{{ message(user.current.value) }}
+