Skip to content

Commit bd1f66f

Browse files
author
Dennis Labordus
authored
Merge pull request #61 from com-pas/develop
Merge Develop to Main (for release)
2 parents a0c8204 + 9c0f2a8 commit bd1f66f

File tree

8 files changed

+512
-14
lines changed

8 files changed

+512
-14
lines changed

app/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ SPDX-License-Identifier: Apache-2.0
8181
<groupId>io.quarkus</groupId>
8282
<artifactId>quarkus-hibernate-validator</artifactId>
8383
</dependency>
84+
<dependency>
85+
<groupId>io.quarkus</groupId>
86+
<artifactId>quarkus-oidc</artifactId>
87+
</dependency>
8488

8589
<!-- Test Dependencies -->
8690
<dependency>
@@ -98,6 +102,11 @@ SPDX-License-Identifier: Apache-2.0
98102
<artifactId>rest-assured</artifactId>
99103
<scope>test</scope>
100104
</dependency>
105+
<dependency>
106+
<groupId>io.quarkus</groupId>
107+
<artifactId>quarkus-test-security-oidc</artifactId>
108+
<scope>test</scope>
109+
</dependency>
101110
<dependency>
102111
<groupId>io.quarkus</groupId>
103112
<artifactId>quarkus-jacoco</artifactId>

app/src/main/java/org/lfenergy/compas/scl/data/rest/Constants.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,9 @@ private Constants() {
1010
public static final String TYPE_PATH_PARAM = "type";
1111
public static final String ID_PATH_PARAM = "id";
1212
public static final String VERSION_PATH_PARAM = "version";
13+
14+
public static final String READ_ROLE = "READ";
15+
public static final String CREATE_ROLE = "CREATE";
16+
public static final String UPDATE_ROLE = "UPDATE";
17+
public static final String DELETE_ROLE = "DELETE";
1318
}

app/src/main/java/org/lfenergy/compas/scl/data/rest/v1/CompasCommonResource.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,45 @@
33
// SPDX-License-Identifier: Apache-2.0
44
package org.lfenergy.compas.scl.data.rest.v1;
55

6+
import io.quarkus.security.Authenticated;
7+
import io.quarkus.security.identity.SecurityIdentity;
68
import org.lfenergy.compas.scl.data.model.SclType;
79
import org.lfenergy.compas.scl.data.rest.v1.model.Type;
810
import org.lfenergy.compas.scl.data.rest.v1.model.TypeListResponse;
911

12+
import javax.enterprise.context.RequestScoped;
13+
import javax.inject.Inject;
1014
import javax.ws.rs.GET;
1115
import javax.ws.rs.Path;
1216
import javax.ws.rs.Produces;
1317
import javax.ws.rs.core.MediaType;
1418
import java.util.Arrays;
19+
import java.util.Comparator;
1520
import java.util.stream.Collectors;
1621

22+
import static org.lfenergy.compas.scl.data.rest.Constants.READ_ROLE;
23+
24+
@Authenticated
25+
@RequestScoped
1726
@Path("/common/v1/")
1827
public class CompasCommonResource {
28+
@Inject
29+
SecurityIdentity securityIdentity;
30+
1931
@GET
2032
@Path("/type/list")
2133
@Produces(MediaType.APPLICATION_XML)
2234
public TypeListResponse list() {
35+
// Retrieve the roles the loggedin user has.
36+
var roles = securityIdentity.getRoles();
37+
2338
var response = new TypeListResponse();
2439
response.setTypes(
2540
Arrays.stream(SclType.values())
41+
// Filter on the type the user has read rights.
42+
.filter(sclType -> roles.contains(sclType.name() + "_" + READ_ROLE))
2643
.map(sclType -> new Type(sclType.name(), sclType.getDescription()))
44+
.sorted(Comparator.comparing(Type::getDescription))
2745
.collect(Collectors.toList()));
2846
return response;
2947
}

app/src/main/java/org/lfenergy/compas/scl/data/rest/v1/CompasSclDataResource.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
// SPDX-License-Identifier: Apache-2.0
44
package org.lfenergy.compas.scl.data.rest.v1;
55

6+
import io.quarkus.security.Authenticated;
67
import org.lfenergy.compas.core.commons.ElementConverter;
78
import org.lfenergy.compas.scl.data.model.SclType;
89
import org.lfenergy.compas.scl.data.model.Version;
910
import org.lfenergy.compas.scl.data.rest.v1.model.*;
1011
import org.lfenergy.compas.scl.data.service.CompasSclDataService;
1112

13+
import javax.enterprise.context.RequestScoped;
1214
import javax.inject.Inject;
1315
import javax.validation.Valid;
1416
import javax.ws.rs.*;
@@ -17,15 +19,18 @@
1719

1820
import static org.lfenergy.compas.scl.data.rest.Constants.*;
1921

22+
@Authenticated
23+
@RequestScoped
2024
@Path("/scl/v1/{" + TYPE_PATH_PARAM + "}")
2125
public class CompasSclDataResource {
22-
private CompasSclDataService compasSclDataService;
23-
24-
private ElementConverter converter = new ElementConverter();
26+
private final CompasSclDataService compasSclDataService;
27+
private final ElementConverter converter;
2528

2629
@Inject
27-
public CompasSclDataResource(CompasSclDataService compasSclDataService) {
30+
public CompasSclDataResource(CompasSclDataService compasSclDataService,
31+
ElementConverter converter) {
2832
this.compasSclDataService = compasSclDataService;
33+
this.converter = converter;
2934
}
3035

3136
@POST

app/src/main/resources/application.properties

Lines changed: 139 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,147 @@ quarkus.log.level = INFO
1010
quarkus.log.category."org.lfenergy.compas.scl.data".level = INFO
1111

1212
# BaseX configuration
13-
basex.host = ${BASEX_HOST:localhost}
14-
basex.port = ${BASEX_PORT:1984}
15-
basex.username = ${BASEX_USERNAME:admin}
16-
basex.password = ${BASEX_PASSWORD:admin}
13+
basex.host = ${BASEX_HOST:localhost}
14+
basex.port = ${BASEX_PORT:1984}
15+
basex.username = ${BASEX_USERNAME:admin}
16+
basex.password = ${BASEX_PASSWORD:admin}
1717

1818
# Dev Profile overrides.
19-
%dev.quarkus.http.port = 9090
20-
%dev.quarkus.http.cors = true
19+
%dev.quarkus.http.port = 9090
20+
%dev.quarkus.http.cors = true
2121

2222
%dev.quarkus.log.level = DEBUG
2323
%dev.quarkus.log.category."org.lfenergy.compas.scl.data".level = DEBUG
24+
25+
# Open ID Connect
26+
quarkus.oidc.auth-server-url = ${AUTH_SERVER_URL:http://localhost:8080/auth/realms/compas}
27+
quarkus.oidc.client-id = ${AUTH_CLIENT_ID:scl-data-service}
28+
quarkus.oidc.application-type = service
29+
30+
quarkus.http.auth.permission.deny-default.paths=/*
31+
quarkus.http.auth.permission.deny-default.policy=deny
32+
33+
quarkus.http.auth.permission.allow-quarkus-services.paths=/compas-scl-data-service/q/health/live,/compas-scl-data-service/q/health/ready,/compas-scl-data-service/q/openapi
34+
quarkus.http.auth.permission.allow-quarkus-services.policy=permit
35+
36+
quarkus.http.auth.permission.common.paths=/compas-scl-data-service/common/v1/*
37+
quarkus.http.auth.permission.common.policy=authenticated
38+
39+
quarkus.http.auth.policy.SSD_READ.roles-allowed=SSD_READ
40+
quarkus.http.auth.permission.SSD_READ_GET.paths=/compas-scl-data-service/scl/v1/SSD/*
41+
quarkus.http.auth.permission.SSD_READ_GET.policy=SSD_READ
42+
quarkus.http.auth.permission.SSD_READ_GET.methods=GET
43+
quarkus.http.auth.policy.SSD_CREATE.roles-allowed=SSD_CREATE
44+
quarkus.http.auth.permission.SSD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SSD
45+
quarkus.http.auth.permission.SSD_CREATE_POST.policy=SSD_CREATE
46+
quarkus.http.auth.permission.SSD_CREATE_POST.methods=POST
47+
quarkus.http.auth.policy.SSD_UPDATE.roles-allowed=SSD_UPDATE
48+
quarkus.http.auth.permission.SSD_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/SSD/*
49+
quarkus.http.auth.permission.SSD_UPDATE_PUT.policy=SSD_UPDATE
50+
quarkus.http.auth.permission.SSD_UPDATE_PUT.methods=PUT
51+
quarkus.http.auth.policy.SSD_DELETE.roles-allowed=SSD_DELETE
52+
quarkus.http.auth.permission.SSD_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/SSD/*
53+
quarkus.http.auth.permission.SSD_DELETE_DELETE.policy=SSD_DELETE
54+
quarkus.http.auth.permission.SSD_DELETE_DELETE.methods=DELETE
55+
56+
quarkus.http.auth.policy.IID_READ.roles-allowed=IID_READ
57+
quarkus.http.auth.permission.IID_READ_GET.paths=/compas-scl-data-service/scl/v1/IID/*
58+
quarkus.http.auth.permission.IID_READ_GET.policy=IID_READ
59+
quarkus.http.auth.permission.IID_READ_GET.methods=GET
60+
quarkus.http.auth.policy.IID_CREATE.roles-allowed=IID_CREATE
61+
quarkus.http.auth.permission.IID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/IID
62+
quarkus.http.auth.permission.IID_CREATE_POST.policy=IID_CREATE
63+
quarkus.http.auth.permission.IID_CREATE_POST.methods=POST
64+
quarkus.http.auth.policy.IID_UPDATE.roles-allowed=IID_UPDATE
65+
quarkus.http.auth.permission.IID_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/IID/*
66+
quarkus.http.auth.permission.IID_UPDATE_PUT.policy=IID_UPDATE
67+
quarkus.http.auth.permission.IID_UPDATE_PUT.methods=PUT
68+
quarkus.http.auth.policy.IID_DELETE.roles-allowed=IID_DELETE
69+
quarkus.http.auth.permission.IID_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/IID/*
70+
quarkus.http.auth.permission.IID_DELETE_DELETE.policy=IID_DELETE
71+
quarkus.http.auth.permission.IID_DELETE_DELETE.methods=DELETE
72+
73+
quarkus.http.auth.policy.ICD_READ.roles-allowed=ICD_READ
74+
quarkus.http.auth.permission.ICD_READ_GET.paths=/compas-scl-data-service/scl/v1/ICD/*
75+
quarkus.http.auth.permission.ICD_READ_GET.policy=ICD_READ
76+
quarkus.http.auth.permission.ICD_READ_GET.methods=GET
77+
quarkus.http.auth.policy.ICD_CREATE.roles-allowed=ICD_CREATE
78+
quarkus.http.auth.permission.ICD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ICD
79+
quarkus.http.auth.permission.ICD_CREATE_POST.policy=ICD_CREATE
80+
quarkus.http.auth.permission.ICD_CREATE_POST.methods=POST
81+
quarkus.http.auth.policy.ICD_UPDATE.roles-allowed=ICD_UPDATE
82+
quarkus.http.auth.permission.ICD_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/ICD/*
83+
quarkus.http.auth.permission.ICD_UPDATE_PUT.policy=ICD_UPDATE
84+
quarkus.http.auth.permission.ICD_UPDATE_PUT.methods=PUT
85+
quarkus.http.auth.policy.ICD_DELETE.roles-allowed=ICD_DELETE
86+
quarkus.http.auth.permission.ICD_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/ICD/*
87+
quarkus.http.auth.permission.ICD_DELETE_DELETE.policy=ICD_DELETE
88+
quarkus.http.auth.permission.ICD_DELETE_DELETE.methods=DELETE
89+
90+
quarkus.http.auth.policy.SCD_READ.roles-allowed=SCD_READ
91+
quarkus.http.auth.permission.SCD_READ_GET.paths=/compas-scl-data-service/scl/v1/SCD/*
92+
quarkus.http.auth.permission.SCD_READ_GET.policy=SCD_READ
93+
quarkus.http.auth.permission.SCD_READ_GET.methods=GET
94+
quarkus.http.auth.policy.SCD_CREATE.roles-allowed=SCD_CREATE
95+
quarkus.http.auth.permission.SCD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SCD
96+
quarkus.http.auth.permission.SCD_CREATE_POST.policy=SCD_CREATE
97+
quarkus.http.auth.permission.SCD_CREATE_POST.methods=POST
98+
quarkus.http.auth.policy.SCD_UPDATE.roles-allowed=SCD_UPDATE
99+
quarkus.http.auth.permission.SCD_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/SCD/*
100+
quarkus.http.auth.permission.SCD_UPDATE_PUT.policy=SCD_UPDATE
101+
quarkus.http.auth.permission.SCD_UPDATE_PUT.methods=PUT
102+
quarkus.http.auth.policy.SCD_DELETE.roles-allowed=SCD_DELETE
103+
quarkus.http.auth.permission.SCD_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/SCD/*
104+
quarkus.http.auth.permission.SCD_DELETE_DELETE.policy=SCD_DELETE
105+
quarkus.http.auth.permission.SCD_DELETE_DELETE.methods=DELETE
106+
107+
quarkus.http.auth.policy.CID_READ.roles-allowed=CID_READ
108+
quarkus.http.auth.permission.CID_READ_GET.paths=/compas-scl-data-service/scl/v1/CID/*
109+
quarkus.http.auth.permission.CID_READ_GET.policy=CID_READ
110+
quarkus.http.auth.permission.CID_READ_GET.methods=GET
111+
quarkus.http.auth.policy.CID_CREATE.roles-allowed=CID_CREATE
112+
quarkus.http.auth.permission.CID_CREATE_POST.paths=/compas-scl-data-service/scl/v1/CID
113+
quarkus.http.auth.permission.CID_CREATE_POST.policy=CID_CREATE
114+
quarkus.http.auth.permission.CID_CREATE_POST.methods=POST
115+
quarkus.http.auth.policy.CID_UPDATE.roles-allowed=CID_UPDATE
116+
quarkus.http.auth.permission.CID_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/CID/*
117+
quarkus.http.auth.permission.CID_UPDATE_PUT.policy=CID_UPDATE
118+
quarkus.http.auth.permission.CID_UPDATE_PUT.methods=PUT
119+
quarkus.http.auth.policy.CID_DELETE.roles-allowed=CID_DELETE
120+
quarkus.http.auth.permission.CID_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/CID/*
121+
quarkus.http.auth.permission.CID_DELETE_DELETE.policy=CID_DELETE
122+
quarkus.http.auth.permission.CID_DELETE_DELETE.methods=DELETE
123+
124+
quarkus.http.auth.policy.SED_READ.roles-allowed=SED_READ
125+
quarkus.http.auth.permission.SED_READ_GET.paths=/compas-scl-data-service/scl/v1/SED/*
126+
quarkus.http.auth.permission.SED_READ_GET.policy=SED_READ
127+
quarkus.http.auth.permission.SED_READ_GET.methods=GET
128+
quarkus.http.auth.policy.SED_CREATE.roles-allowed=SED_CREATE
129+
quarkus.http.auth.permission.SED_CREATE_POST.paths=/compas-scl-data-service/scl/v1/SED
130+
quarkus.http.auth.permission.SED_CREATE_POST.policy=SED_CREATE
131+
quarkus.http.auth.permission.SED_CREATE_POST.methods=POST
132+
quarkus.http.auth.policy.SED_UPDATE.roles-allowed=SED_UPDATE
133+
quarkus.http.auth.permission.SED_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/SED/*
134+
quarkus.http.auth.permission.SED_UPDATE_PUT.policy=SED_UPDATE
135+
quarkus.http.auth.permission.SED_UPDATE_PUT.methods=PUT
136+
quarkus.http.auth.policy.SED_DELETE.roles-allowed=SED_DELETE
137+
quarkus.http.auth.permission.SED_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/SED/*
138+
quarkus.http.auth.permission.SED_DELETE_DELETE.policy=SED_DELETE
139+
quarkus.http.auth.permission.SED_DELETE_DELETE.methods=DELETE
140+
141+
quarkus.http.auth.policy.ISD_READ.roles-allowed=ISD_READ
142+
quarkus.http.auth.permission.ISD_READ_GET.paths=/compas-scl-data-service/scl/v1/ISD/*
143+
quarkus.http.auth.permission.ISD_READ_GET.policy=ISD_READ
144+
quarkus.http.auth.permission.ISD_READ_GET.methods=GET
145+
quarkus.http.auth.policy.ISD_CREATE.roles-allowed=ISD_CREATE
146+
quarkus.http.auth.permission.ISD_CREATE_POST.paths=/compas-scl-data-service/scl/v1/ISD
147+
quarkus.http.auth.permission.ISD_CREATE_POST.policy=ISD_CREATE
148+
quarkus.http.auth.permission.ISD_CREATE_POST.methods=POST
149+
quarkus.http.auth.policy.ISD_UPDATE.roles-allowed=ISD_UPDATE
150+
quarkus.http.auth.permission.ISD_UPDATE_PUT.paths=/compas-scl-data-service/scl/v1/ISD/*
151+
quarkus.http.auth.permission.ISD_UPDATE_PUT.policy=ISD_UPDATE
152+
quarkus.http.auth.permission.ISD_UPDATE_PUT.methods=PUT
153+
quarkus.http.auth.policy.ISD_DELETE.roles-allowed=ISD_DELETE
154+
quarkus.http.auth.permission.ISD_DELETE_DELETE.paths=/compas-scl-data-service/scl/v1/ISD/*
155+
quarkus.http.auth.permission.ISD_DELETE_DELETE.policy=ISD_DELETE
156+
quarkus.http.auth.permission.ISD_DELETE_DELETE.methods=DELETE

app/src/test/java/org/lfenergy/compas/scl/data/rest/v1/CompasCommonResourceTest.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@
55

66
import io.quarkus.test.common.http.TestHTTPEndpoint;
77
import io.quarkus.test.junit.QuarkusTest;
8+
import io.quarkus.test.security.TestSecurity;
89
import org.junit.jupiter.api.Test;
9-
import org.lfenergy.compas.scl.data.model.SclType;
1010

1111
import static io.restassured.RestAssured.given;
1212
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
import static org.lfenergy.compas.scl.data.rest.Constants.READ_ROLE;
1314

1415
@QuarkusTest
1516
@TestHTTPEndpoint(CompasCommonResource.class)
1617
class CompasCommonResourceTest {
1718
@Test
18-
void list_WhenCalled_ThenItemResponseRetrieved() {
19+
@TestSecurity(user = "test-user", roles = {"IID_" + READ_ROLE, "SCD_" + READ_ROLE})
20+
void list_WhenCalledWithMultipleReadRights_ThenMultipleItemResponseRetrieved() {
1921
var response = given()
2022
.when().get("/type/list")
2123
.then()
@@ -24,6 +26,43 @@ void list_WhenCalled_ThenItemResponseRetrieved() {
2426
.response();
2527

2628
var xmlPath = response.xmlPath();
27-
assertEquals(SclType.values().length, xmlPath.getList("TypeListResponse.Type").size());
29+
// User has read rights for 2 types, so these types are returned.
30+
var sclTypes = xmlPath.getList("TypeListResponse.Type.Code");
31+
assertEquals(2, sclTypes.size());
32+
assertEquals("IID", sclTypes.get(0));
33+
assertEquals("SCD", sclTypes.get(1));
34+
}
35+
36+
@Test
37+
@TestSecurity(user = "test-user", roles = {"SCD_" + READ_ROLE})
38+
void list_WhenCalledWithOneReadRights_ThenOneItemResponseRetrieved() {
39+
var response = given()
40+
.when().get("/type/list")
41+
.then()
42+
.statusCode(200)
43+
.extract()
44+
.response();
45+
46+
var xmlPath = response.xmlPath();
47+
// User has read rights for 2 types, so these types are returned.
48+
var sclTypes = xmlPath.getList("TypeListResponse.Type.Code");
49+
assertEquals(1, sclTypes.size());
50+
assertEquals("SCD", sclTypes.get(0));
51+
}
52+
53+
@Test
54+
@TestSecurity(user = "test-user")
55+
void list_WhenCalledWithNoReadRights_ThenNoItemResponseRetrieved() {
56+
var response = given()
57+
.when().get("/type/list")
58+
.then()
59+
.statusCode(200)
60+
.extract()
61+
.response();
62+
63+
var xmlPath = response.xmlPath();
64+
// User has read rights for 2 types, so these types are returned.
65+
var sclTypes = xmlPath.getList("TypeListResponse.Type.Code");
66+
assertEquals(0, sclTypes.size());
2867
}
2968
}

app/src/test/java/org/lfenergy/compas/scl/data/rest/v1/CompasSclDataResourceTest.java renamed to app/src/test/java/org/lfenergy/compas/scl/data/rest/v1/CompasSclDataResourceAsEditorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.quarkus.test.common.http.TestHTTPEndpoint;
77
import io.quarkus.test.junit.QuarkusTest;
88
import io.quarkus.test.junit.mockito.InjectMock;
9+
import io.quarkus.test.security.TestSecurity;
910
import io.restassured.http.ContentType;
1011
import org.junit.jupiter.api.Test;
1112
import org.lfenergy.compas.core.commons.ElementConverter;
@@ -32,7 +33,8 @@
3233

3334
@QuarkusTest
3435
@TestHTTPEndpoint(CompasSclDataResource.class)
35-
class CompasSclDataResourceTest {
36+
@TestSecurity(user = "test-reader", roles = {"SCD_" + READ_ROLE, "SCD_" + CREATE_ROLE, "SCD_" + UPDATE_ROLE, "SCD_" + DELETE_ROLE})
37+
class CompasSclDataResourceAsEditorTest {
3638
@InjectMock
3739
private CompasSclDataService compasSclDataService;
3840

0 commit comments

Comments
 (0)