Skip to content

Commit e2d95df

Browse files
authored
feat: static api enpoints protected by SAF check (#1764)
* protect static def api with saf resource check Signed-off-by: achmelo <a.chmelo@gmail.com> * correct SC Signed-off-by: achmelo <a.chmelo@gmail.com> * remove access with cert Signed-off-by: achmelo <a.chmelo@gmail.com>
1 parent b6790cb commit e2d95df

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

api-catalog-package/src/main/resources/bin/start.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ _BPX_JOBNAME=${ZOWE_PREFIX}${CATALOG_CODE} java \
104104
-Dapiml.discovery.staticApiDefinitionsDirectories=${APIML_STATIC_DEF} \
105105
-Dapiml.security.ssl.verifySslCertificatesOfServices=${VERIFY_CERTIFICATES:-false} \
106106
-Dapiml.security.ssl.nonStrictVerifySslCertificatesOfServices=${NONSTRICT_VERIFY_CERTIFICATES:-false} \
107+
-Dapiml.security.authorization.provider=${APIML_SECURITY_AUTHORIZATION_PROVIDER:-} \
108+
-Dapiml.security.authorization.endpoint.enabled=${APIML_SECURITY_AUTHORIZATION_ENDPOINT_ENABLED:-false} \
109+
-Dapiml.security.authorization.endpoint.url=${APIML_SECURITY_AUTHORIZATION_ENDPOINT_URL:-"https://${EXPLORER_HOST}:${GATEWAY_SERVICE_PORT}/zss/api/v1/saf-auth"} \
110+
-Dapiml.security.authorization.resourceClass=${RESOURCE_CLASS:-ZOWE} \
107111
-Dspring.profiles.include=$LOG_LEVEL \
108112
-Dserver.address=0.0.0.0 \
109113
-Dserver.ssl.enabled=${APIML_SSL_ENABLED:-true} \

api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/staticapi/StaticDefinitionController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import lombok.RequiredArgsConstructor;
1414
import org.springframework.http.MediaType;
1515
import org.springframework.http.ResponseEntity;
16+
import org.springframework.security.access.prepost.PreAuthorize;
1617
import org.springframework.web.bind.annotation.*;
1718

1819
import java.io.IOException;
@@ -24,6 +25,7 @@
2425
@RestController
2526
@RequestMapping("/static-api")
2627
@RequiredArgsConstructor
28+
@PreAuthorize("hasSafServiceResourceAccess('SERVICES', 'READ')")
2729
public class StaticDefinitionController {
2830
private final StaticDefinitionGenerator staticDefinitionGenerator;
2931

integration-tests/src/test/java/org/zowe/apiml/functional/apicatalog/ApiCatalogEndpointIntegrationTest.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@
2424
import org.springframework.http.MediaType;
2525
import org.zowe.apiml.util.TestWithStartedInstances;
2626
import org.zowe.apiml.util.categories.CatalogTest;
27-
import org.zowe.apiml.util.config.*;
28-
import org.zowe.apiml.util.http.*;
27+
import org.zowe.apiml.util.config.ConfigReader;
28+
import org.zowe.apiml.util.config.GatewayServiceConfiguration;
29+
import org.zowe.apiml.util.config.SslContext;
30+
import org.zowe.apiml.util.http.HttpClientUtils;
31+
import org.zowe.apiml.util.http.HttpRequestUtils;
32+
import org.zowe.apiml.util.http.HttpSecurityUtils;
2933

3034
import java.io.IOException;
3135
import java.net.URI;
@@ -51,6 +55,11 @@ class ApiCatalogEndpointIntegrationTest implements TestWithStartedInstances {
5155
private static final String GET_API_CATALOG_API_DOC_ENDPOINT = "/apicatalog/api/v1/apidoc/apicatalog/v1";
5256
private static final String INVALID_API_CATALOG_API_DOC_ENDPOINT = "/apicatalog/api/v1/apidoc/apicatalog/v2";
5357

58+
private final static String UNAUTHORIZED_USERNAME = ConfigReader.environmentConfiguration().getAuxiliaryUserList().getCredentials("servicesinfo-unauthorized").get(0).getUser();
59+
private final static String UNAUTHORIZED_PASSWORD = ConfigReader.environmentConfiguration().getAuxiliaryUserList().getCredentials("servicesinfo-unauthorized").get(0).getPassword();
60+
private final static String USERNAME = ConfigReader.environmentConfiguration().getAuxiliaryUserList().getCredentials("servicesinfo-authorized").get(0).getUser();
61+
private final static String PASSWORD = ConfigReader.environmentConfiguration().getAuxiliaryUserList().getCredentials("servicesinfo-authorized").get(0).getPassword();
62+
5463
private String baseHost;
5564

5665
@BeforeEach
@@ -169,23 +178,30 @@ void cleanupStaticDefinition() {
169178
@Test
170179
@Order(1)
171180
void whenCallStaticApiRefresh_thenResponseOk() throws IOException {
172-
getStaticApiResponse(REFRESH_STATIC_APIS_ENDPOINT, null, HttpStatus.SC_OK, null);
181+
getStaticApiResponse(REFRESH_STATIC_APIS_ENDPOINT, null, HttpStatus.SC_OK, null, gatewayToken(USERNAME, PASSWORD));
173182
}
174183

175184
@Test
176185
@Order(30)
177186
void whenCallStaticDefinitionGenerate_thenResponse201() throws IOException {
178187
String json = "# Dummy content";
179-
getStaticApiResponse(STATIC_DEFINITION_GENERATE_ENDPOINT, staticDefinitionServiceId ,HttpStatus.SC_CREATED, json);
188+
getStaticApiResponse(STATIC_DEFINITION_GENERATE_ENDPOINT, staticDefinitionServiceId, HttpStatus.SC_CREATED, json, gatewayToken(USERNAME, PASSWORD));
189+
}
190+
191+
@Test
192+
@Order(31)
193+
void whenCallStaticDefinitionGenerateWithUnauthorizedUser_thenResponse403() throws IOException {
194+
String json = "# Dummy content";
195+
getStaticApiResponse(STATIC_DEFINITION_GENERATE_ENDPOINT, staticDefinitionServiceId, HttpStatus.SC_FORBIDDEN, json, gatewayToken(UNAUTHORIZED_USERNAME, UNAUTHORIZED_PASSWORD));
180196
}
181197

182-
private Response getStaticApiResponse(String endpoint, String definitionFileName, int returnCode, String body) throws IOException {
198+
private Response getStaticApiResponse(String endpoint, String definitionFileName, int returnCode, String body, String JWT) throws IOException {
183199
URI uri = getUriFromGateway(endpoint);
184200
RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
185201

186202
RequestSpecification requestSpecification = given().config(SslContext.tlsWithoutCert).relaxedHTTPSValidation()
187203
.when()
188-
.cookie(COOKIE_NAME, gatewayToken())
204+
.cookie(COOKIE_NAME, JWT)
189205
.header("Accept", MediaType.APPLICATION_JSON_VALUE);
190206
if (body != null) {
191207
requestSpecification

0 commit comments

Comments
 (0)