Repository: nifi-registry Updated Branches: refs/heads/master 6c48025c5 -> 2f230d6e3
NIFIREG-74 Change login to use HTTP Basic Auth Changes the REST API /access/token/login endpoint to use HTTP Basic Auth for reading username and password. Other minor changes to API documentation included. This closes #63. Signed-off-by: Bryan Bende <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi-registry/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi-registry/commit/2f230d6e Tree: http://git-wip-us.apache.org/repos/asf/nifi-registry/tree/2f230d6e Diff: http://git-wip-us.apache.org/repos/asf/nifi-registry/diff/2f230d6e Branch: refs/heads/master Commit: 2f230d6e34d3abf9cdaabeb2bdeed5ee8e6cf01f Parents: 6c48025 Author: Kevin Doran <[email protected]> Authored: Wed Dec 20 16:56:50 2017 -0500 Committer: Bryan Bende <[email protected]> Committed: Thu Dec 21 11:45:07 2017 -0500 ---------------------------------------------------------------------- nifi-registry-assembly/pom.xml | 2 +- .../client/impl/BucketItemDeserializer.java | 2 +- .../nifi/registry/bucket/BucketItemType.java | 5 ++- .../nifi/registry/flow/VersionedFlow.java | 2 +- .../registry/NiFiRegistryApiApplication.java | 5 ++- .../web/NiFiRegistryResourceConfig.java | 14 +------ .../nifi/registry/web/api/AccessResource.java | 41 +++++++++++--------- .../nifi/registry/web/api/BucketResource.java | 5 +-- .../nifi/registry/web/api/ItemResource.java | 25 +++++++++++- .../apache/nifi/registry/web/TestRestAPI.java | 2 +- .../apache/nifi/registry/web/api/FlowsIT.java | 6 +-- .../nifi/registry/web/api/SecureLdapIT.java | 25 ++++++------ .../src/main/webapp/services/nf-registry.api.js | 9 ++--- 13 files changed, 79 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-assembly/pom.xml ---------------------------------------------------------------------- diff --git a/nifi-registry-assembly/pom.xml b/nifi-registry-assembly/pom.xml index 45df1c4..6dea4b6 100644 --- a/nifi-registry-assembly/pom.xml +++ b/nifi-registry-assembly/pom.xml @@ -137,7 +137,7 @@ <!-- nifi-registry.properties: web properties --> <nifi.registry.web.war.directory>./lib</nifi.registry.web.war.directory> <nifi.registry.web.http.host /> - <nifi.registry.web.http.port>8080</nifi.registry.web.http.port> + <nifi.registry.web.http.port>18080</nifi.registry.web.http.port> <nifi.registry.web.https.host /> <nifi.registry.web.https.port /> <nifi.registry.jetty.work.dir>./work/jetty</nifi.registry.jetty.work.dir> http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-client/src/main/java/org/apache/nifi/registry/client/impl/BucketItemDeserializer.java ---------------------------------------------------------------------- diff --git a/nifi-registry-client/src/main/java/org/apache/nifi/registry/client/impl/BucketItemDeserializer.java b/nifi-registry-client/src/main/java/org/apache/nifi/registry/client/impl/BucketItemDeserializer.java index 4ea5005..5640d43 100644 --- a/nifi-registry-client/src/main/java/org/apache/nifi/registry/client/impl/BucketItemDeserializer.java +++ b/nifi-registry-client/src/main/java/org/apache/nifi/registry/client/impl/BucketItemDeserializer.java @@ -61,7 +61,7 @@ public class BucketItemDeserializer extends StdDeserializer<BucketItem[]> { switch (bucketItemType) { - case FLOW: + case Flow: final VersionedFlow versionedFlow = jsonParser.getCodec().treeToValue(node, VersionedFlow.class); bucketItems.add(versionedFlow); break; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/bucket/BucketItemType.java ---------------------------------------------------------------------- diff --git a/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/bucket/BucketItemType.java b/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/bucket/BucketItemType.java index d1966ae..e119c02 100644 --- a/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/bucket/BucketItemType.java +++ b/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/bucket/BucketItemType.java @@ -21,6 +21,7 @@ package org.apache.nifi.registry.bucket; */ public enum BucketItemType { - FLOW; - + // The case of these enum names matches what we want to return in + // the BucketItem.type field when serialized in an API response. + Flow; } http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/flow/VersionedFlow.java ---------------------------------------------------------------------- diff --git a/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/flow/VersionedFlow.java b/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/flow/VersionedFlow.java index 065fb04..6ece46a 100644 --- a/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/flow/VersionedFlow.java +++ b/nifi-registry-data-model/src/main/java/org/apache/nifi/registry/flow/VersionedFlow.java @@ -41,7 +41,7 @@ public class VersionedFlow extends BucketItem { private long versionCount; public VersionedFlow() { - super(BucketItemType.FLOW); + super(BucketItemType.Flow); } @ApiModelProperty(value = "The number of versions of this flow.", readOnly = true) http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/NiFiRegistryApiApplication.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/NiFiRegistryApiApplication.java b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/NiFiRegistryApiApplication.java index 4a0bcbc..fa96e18 100644 --- a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/NiFiRegistryApiApplication.java +++ b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/NiFiRegistryApiApplication.java @@ -18,6 +18,7 @@ package org.apache.nifi.registry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; /** @@ -27,8 +28,10 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer * package across other modules. This is done because spring-boot will use the package of this * class to automatically scan for beans/config/entities/etc. and would otherwise require * configuring custom packages to scan in several different places. + * + * WebMvcAutoConfiguration is excluded because our web app is using Jersey in place of SpringMVC */ -@SpringBootApplication +@SpringBootApplication(exclude = WebMvcAutoConfiguration.class) public class NiFiRegistryApiApplication extends SpringBootServletInitializer { public static final String NIFI_REGISTRY_PROPERTIES_ATTRIBUTE = "nifi-registry.properties"; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/NiFiRegistryResourceConfig.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/NiFiRegistryResourceConfig.java b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/NiFiRegistryResourceConfig.java index 118fc9f..878ec90 100644 --- a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/NiFiRegistryResourceConfig.java +++ b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/NiFiRegistryResourceConfig.java @@ -16,25 +16,20 @@ */ package org.apache.nifi.registry.web; +import org.apache.nifi.registry.web.api.AccessPolicyResource; import org.apache.nifi.registry.web.api.AccessResource; import org.apache.nifi.registry.web.api.BucketFlowResource; import org.apache.nifi.registry.web.api.BucketResource; import org.apache.nifi.registry.web.api.FlowResource; import org.apache.nifi.registry.web.api.ItemResource; -import org.apache.nifi.registry.web.api.AccessPolicyResource; import org.apache.nifi.registry.web.api.TenantResource; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ServerProperties; import org.glassfish.jersey.server.filter.HttpMethodOverrideFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.filter.HiddenHttpMethodFilter; -import javax.servlet.Filter; import javax.servlet.ServletContext; import javax.ws.rs.core.Context; @@ -74,11 +69,4 @@ public class NiFiRegistryResourceConfig extends ResourceConfig { property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true); } - // Disable default SpringMVC filter beans that are not compatible with Jersey - @Bean - public FilterRegistrationBean registration(@Autowired HiddenHttpMethodFilter filter) { - FilterRegistrationBean registration = new FilterRegistrationBean((Filter) filter); - registration.setEnabled(false); - return registration; - } } http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/AccessResource.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/AccessResource.java b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/AccessResource.java index d232c4a..1bff31f 100644 --- a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/AccessResource.java +++ b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/AccessResource.java @@ -22,14 +22,14 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import org.apache.commons.lang3.StringUtils; -import org.apache.nifi.registry.exception.AdministrationException; import org.apache.nifi.registry.authorization.CurrentUser; +import org.apache.nifi.registry.exception.AdministrationException; import org.apache.nifi.registry.properties.NiFiRegistryProperties; import org.apache.nifi.registry.security.authentication.AuthenticationRequest; import org.apache.nifi.registry.security.authentication.AuthenticationResponse; +import org.apache.nifi.registry.security.authentication.BasicAuthIdentityProvider; import org.apache.nifi.registry.security.authentication.IdentityProvider; import org.apache.nifi.registry.security.authentication.IdentityProviderUsage; -import org.apache.nifi.registry.security.authentication.UsernamePasswordAuthenticationRequest; import org.apache.nifi.registry.security.authentication.exception.IdentityAccessException; import org.apache.nifi.registry.security.authentication.exception.InvalidCredentialsException; import org.apache.nifi.registry.security.authorization.user.NiFiUser; @@ -47,7 +47,6 @@ import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -196,12 +195,14 @@ public class AccessResource extends ApplicationResource { * @return A JWT (string) */ @POST - @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @Consumes(MediaType.WILDCARD) @Produces(MediaType.TEXT_PLAIN) @Path("/token/login") @ApiOperation( value = "Creates a token for accessing the REST API via username/password", - notes = "The token returned is formatted as a JSON Web Token (JWT). The token is base64 encoded and comprised of three parts. The header, " + + notes = "The user credentials must be passed in standard HTTP Basic Auth format. " + + "That is: 'Authorization: Basic <credentials>', where <credentials> is the base64 encoded value of '<username>:<password>'. " + + "The token returned is formatted as a JSON Web Token (JWT). The token is base64 encoded and comprised of three parts. The header, " + "the body, and the signature. The expiration of the token is a contained within the body. The token can be used in the Authorization header " + "in the format 'Authorization: Bearer <token>'.", response = String.class @@ -211,34 +212,38 @@ public class AccessResource extends ApplicationResource { @ApiResponse(code = 401, message = HttpStatusMessages.MESSAGE_401), @ApiResponse(code = 409, message = HttpStatusMessages.MESSAGE_409 + " The NiFi Registry may not be configured to support login with username/password."), @ApiResponse(code = 500, message = HttpStatusMessages.MESSAGE_500) }) - public Response createAccessTokenUsingFormLogin( - @Context HttpServletRequest httpServletRequest, - @FormParam("username") String username, - @FormParam("password") String password) { + public Response createAccessTokenUsingFormLogin(@Context HttpServletRequest httpServletRequest) { // only support access tokens when communicating over HTTPS if (!httpServletRequest.isSecure()) { throw new IllegalStateException("Access tokens are only issued over HTTPS"); } - // if not configured with custom identity provider, or if provider doesn't support username/password authentication, don't consider credentials - if (identityProvider == null || !identityProvider.supports(UsernamePasswordAuthenticationRequest.class)) { - throw new IllegalStateException("Username/Password login not supported by this NiFi"); + // if not configured with custom identity provider, or if provider doesn't support HTTP Basic Auth, don't consider credentials + if (identityProvider == null) { + logger.debug("An Identity Provider must be configured to use this endpoint. Please consult the administration guide."); + throw new IllegalStateException("Username/Password login not supported by this NiFi. Contact System Administrator."); } - - // ensure we have login credentials - if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { - throw new IllegalArgumentException("The username and password must be specified"); + if (!(identityProvider instanceof BasicAuthIdentityProvider)) { + logger.debug("An Identity Provider is configured, but it does not support HTTP Basic Auth authentication. " + + "The configured Identity Provider must extend {}", BasicAuthIdentityProvider.class); + throw new IllegalStateException("Username/Password login not supported by this NiFi. Contact System Administrator."); } // generate JWT for response - AuthenticationRequest authenticationRequest = new UsernamePasswordAuthenticationRequest(username, password); + AuthenticationRequest authenticationRequest = identityProvider.extractCredentials(httpServletRequest); + + if (authenticationRequest == null) { + throw new UnauthorizedException("The client credentials are missing from the request.") + .withAuthenticateChallenge(IdentityProviderUsage.AuthType.OTHER); + } + final String token; try { token = createAccessToken(identityProvider, authenticationRequest); } catch (final InvalidCredentialsException ice){ throw new UnauthorizedException("The supplied client credentials are not valid.", ice) - .withAuthenticateChallenge("form-login"); + .withAuthenticateChallenge(IdentityProviderUsage.AuthType.OTHER); } // form the response http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/BucketResource.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/BucketResource.java b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/BucketResource.java index 479afa3..036cb38 100644 --- a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/BucketResource.java +++ b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/BucketResource.java @@ -118,10 +118,7 @@ public class BucketResource extends AuthorizableApplicationResource { response = Bucket.class, responseContainer = "List" ) - @ApiResponses({ - @ApiResponse(code = 400, message = HttpStatusMessages.MESSAGE_400), - @ApiResponse(code = 401, message = HttpStatusMessages.MESSAGE_401), - @ApiResponse(code = 403, message = HttpStatusMessages.MESSAGE_403) }) + @ApiResponses({ @ApiResponse(code = 401, message = HttpStatusMessages.MESSAGE_401) }) public Response getBuckets() { // Note: We don't explicitly check for access to (READ, /buckets) because http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/ItemResource.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/ItemResource.java b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/ItemResource.java index 8d3c4d7..315b442 100644 --- a/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/ItemResource.java +++ b/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/ItemResource.java @@ -19,6 +19,8 @@ package org.apache.nifi.registry.web.api; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import org.apache.nifi.registry.bucket.BucketItem; import org.apache.nifi.registry.field.Fields; import org.apache.nifi.registry.security.authorization.Authorizer; @@ -42,6 +44,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -81,19 +84,32 @@ public class ItemResource extends AuthorizableApplicationResource { @Produces(MediaType.APPLICATION_JSON) @ApiOperation( value = "Get items across all buckets", - notes = "The returned items will include only items from buckets for which the is authorized.", + notes = "The returned items will include only items from buckets for which the user is authorized. " + + "If the user is not authorized to any buckets, an empty list will be returned.", response = BucketItem.class, responseContainer = "List" ) + @ApiResponses({ @ApiResponse(code = 401, message = HttpStatusMessages.MESSAGE_401) }) public Response getItems() { + // Note: We don't explicitly check for access to (READ, /buckets) or + // (READ, /items ) because a user might have access to individual buckets + // without top-level access. For example, a user that has + // (READ, /buckets/bucket-id-1) but not access to /buckets should not + // get a 403 error returned from this endpoint. This has the side effect + // that a user with no access to any buckets gets an empty array returned + // from this endpoint instead of 403 as one might expect. + final Set<String> authorizedBucketIds = getAuthorizedBucketIds(RequestAction.READ); if (authorizedBucketIds == null || authorizedBucketIds.isEmpty()) { // not authorized for any bucket, return empty list of items return Response.status(Response.Status.OK).entity(new ArrayList<BucketItem>()).build(); } - final List<BucketItem> items = registryService.getBucketItems(authorizedBucketIds); + List<BucketItem> items = registryService.getBucketItems(authorizedBucketIds); + if (items == null) { + items = Collections.emptyList(); + } permissionsService.populateItemPermissions(items); linkService.populateItemLinks(items); @@ -110,6 +126,11 @@ public class ItemResource extends AuthorizableApplicationResource { responseContainer = "List", nickname = "getItemsInBucket" ) + @ApiResponses({ + @ApiResponse(code = 400, message = HttpStatusMessages.MESSAGE_400), + @ApiResponse(code = 401, message = HttpStatusMessages.MESSAGE_401), + @ApiResponse(code = 403, message = HttpStatusMessages.MESSAGE_403), + @ApiResponse(code = 404, message = HttpStatusMessages.MESSAGE_404) }) public Response getItems( @PathParam("bucketId") @ApiParam("The bucket identifier") http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/TestRestAPI.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/TestRestAPI.java b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/TestRestAPI.java index e5851aa..3cbc892 100644 --- a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/TestRestAPI.java +++ b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/TestRestAPI.java @@ -37,7 +37,7 @@ public class TestRestAPI { public static final Logger LOGGER = LoggerFactory.getLogger(TestRestAPI.class); - public static final String REGISTRY_API_URL = "http://localhost:8080/nifi-registry-api"; + public static final String REGISTRY_API_URL = "http://localhost:18080/nifi-registry-api"; public static final String REGISTRY_API_BUCKETS_URL = REGISTRY_API_URL + "/buckets"; public static final String REGISTRY_API_FLOWS_URL = REGISTRY_API_URL + "/flows"; http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/FlowsIT.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/FlowsIT.java b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/FlowsIT.java index d0d02ce..1b4fa82 100644 --- a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/FlowsIT.java +++ b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/FlowsIT.java @@ -75,7 +75,7 @@ public class FlowsIT extends UnsecuredITBase { "\"bucketIdentifier\":\"1\"," + "\"createdTimestamp\":1505091360000," + "\"modifiedTimestamp\":1505091360000," + - "\"type\":\"FLOW\"," + + "\"type\":\"Flow\"," + "\"permissions\":{\"canRead\":true,\"canWrite\":true,\"canDelete\":true}," + "\"link\":{\"params\":{\"rel\":\"self\"},\"href\":\"buckets/1/flows/1\"}}," + "{\"identifier\":\"2\",\"name\":\"Flow 2\"," + @@ -83,7 +83,7 @@ public class FlowsIT extends UnsecuredITBase { "\"bucketIdentifier\":\"1\"," + "\"createdTimestamp\":1505091360000," + "\"modifiedTimestamp\":1505091360000," + - "\"type\":\"FLOW\"," + + "\"type\":\"Flow\"," + "\"permissions\":{\"canRead\":true,\"canWrite\":true,\"canDelete\":true}," + "\"versionCount\":0," + "\"link\":{\"params\":{\"rel\":\"self\"},\"href\":\"buckets/1/flows/2\"}}" + @@ -129,7 +129,7 @@ public class FlowsIT extends UnsecuredITBase { assertNotNull(createdFlow.getIdentifier()); assertNotNull(createdFlow.getBucketName()); assertEquals(0, createdFlow.getVersionCount()); - assertEquals(createdFlow.getType(), BucketItemType.FLOW); + assertEquals(createdFlow.getType(), BucketItemType.Flow); assertTrue(createdFlow.getCreatedTimestamp() - testStartTime > 0L); // both server and client in same JVM, so there shouldn't be skew assertEquals(createdFlow.getCreatedTimestamp(), createdFlow.getModifiedTimestamp()); assertNotNull(createdFlow.getLink()); http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/SecureLdapIT.java ---------------------------------------------------------------------- diff --git a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/SecureLdapIT.java b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/SecureLdapIT.java index 3ee4d83..556e10b 100644 --- a/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/SecureLdapIT.java +++ b/nifi-registry-web-api/src/test/java/org/apache/nifi/registry/web/api/SecureLdapIT.java @@ -18,13 +18,13 @@ package org.apache.nifi.registry.web.api; import org.apache.commons.lang3.StringUtils; import org.apache.nifi.registry.SecureLdapTestApiApplication; -import org.apache.nifi.registry.bucket.Bucket; -import org.apache.nifi.registry.extension.ExtensionManager; import org.apache.nifi.registry.authorization.AccessPolicy; import org.apache.nifi.registry.authorization.AccessPolicySummary; import org.apache.nifi.registry.authorization.CurrentUser; import org.apache.nifi.registry.authorization.Permissions; import org.apache.nifi.registry.authorization.Tenant; +import org.apache.nifi.registry.bucket.Bucket; +import org.apache.nifi.registry.extension.ExtensionManager; import org.apache.nifi.registry.properties.NiFiRegistryProperties; import org.apache.nifi.registry.security.authorization.Authorizer; import org.apache.nifi.registry.security.authorization.AuthorizerFactory; @@ -104,11 +104,12 @@ public class SecureLdapIT extends IntegrationTestBase { @Before public void setup() { - final Form form = encodeCredentialsForURLFormParams("nifiadmin", "password"); + final String basicAuthCredentials = encodeCredentialsForBasicAuth("nifiadmin", "password"); final String token = client - .target(createURL(tokenLoginPath)) + .target(createURL(tokenIdentityProviderPath)) .request() - .post(Entity.form(form), String.class); + .header("Authorization", "Basic " + basicAuthCredentials) + .post(null, String.class); adminAuthToken = token; beforeTestAccessPoliciesSnapshot = createAccessPoliciesSnapshot(); @@ -137,11 +138,12 @@ public class SecureLdapIT extends IntegrationTestBase { "}"; // When: the /access/token/login endpoint is queried - final Form form = encodeCredentialsForURLFormParams("nobel", "password"); + final String basicAuthCredentials = encodeCredentialsForBasicAuth("nobel", "password"); final Response tokenResponse = client - .target(createURL(tokenLoginPath)) + .target(createURL(tokenIdentityProviderPath)) .request() - .post(Entity.form(form), Response.class); + .header("Authorization", "Basic " + basicAuthCredentials) + .post(null, Response.class); // Then: the server returns 200 OK with an access token assertEquals(201, tokenResponse.getStatus()); @@ -371,11 +373,12 @@ public class SecureLdapIT extends IntegrationTestBase { String nobelId = getTenantIdentifierByIdentity("nobel"); String chemistsId = getTenantIdentifierByIdentity("chemists"); // a group containing user "nobel" - final Form form = encodeCredentialsForURLFormParams("nobel", "password"); + final String basicAuthCredentials = encodeCredentialsForBasicAuth("nobel", "password"); final String nobelAuthToken = client - .target(createURL(tokenLoginPath)) + .target(createURL(tokenIdentityProviderPath)) .request() - .post(Entity.form(form), String.class); + .header("Authorization", "Basic " + basicAuthCredentials) + .post(null, String.class); // When: user nobel re-checks top-level permissions final CurrentUser currentUser = client http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/2f230d6e/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js index 3e9d307..9714a44 100644 --- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js +++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js @@ -673,17 +673,14 @@ NfRegistryApi.prototype = { */ postToLogin: function (username, password) { var self = this; + + var encodedCredentials = btoa(username + ":" + password); var headers = new ngCommonHttp.HttpHeaders({ - 'Content-Type': 'application/x-www-form-urlencoded' + 'Authorization': 'Basic ' + encodedCredentials }); - var params = new ngCommonHttp.HttpParams() - .set('username', username) - .set('password', password) - .set('grant_type', 'password'); var options = { headers: headers, - params: params, withCredentials: true, responseType: 'text' };
