This is an automated email from the ASF dual-hosted git repository.
pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new cd1ff92be8 NIFI-14541 Added Scoped Authorization for Flow Registry
Clients
cd1ff92be8 is described below
commit cd1ff92be81cfa4b50b67975b9fa50827c639a7e
Author: exceptionfactory <[email protected]>
AuthorDate: Tue May 6 21:04:32 2025 -0500
NIFI-14541 Added Scoped Authorization for Flow Registry Clients
- Added Registry Client Resource Type with path nested under Controller
- Updated Controller Resource Flow Registry Client methods to use new
Authorizable resolution
Signed-off-by: Pierre Villard <[email protected]>
This closes #9918.
---
.../authorization/resource/ResourceFactory.java | 1 +
.../nifi/authorization/resource/ResourceType.java | 1 +
.../flow/StandardFlowRegistryClientNode.java | 2 +-
.../authorization/StandardAuthorizableLookup.java | 3 ++
.../apache/nifi/web/api/ControllerResource.java | 41 +++++++++++++++-------
5 files changed, 34 insertions(+), 14 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceFactory.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceFactory.java
index 7b5f4d84a0..c6c2b5ff8f 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceFactory.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceFactory.java
@@ -553,6 +553,7 @@ public final class ResourceFactory {
case InputPort -> "Input Port";
case OutputPort -> "Output Port";
case Processor -> "Processor";
+ case RegistryClient -> "Registry Client";
case RemoteProcessGroup -> "Remote Process Group";
case ReportingTask -> "Reporting Task";
case FlowAnalysisRule -> "Flow Analysis Rule";
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceType.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceType.java
index 4cca47fb7a..4c61dad5ff 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceType.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/resource/ResourceType.java
@@ -35,6 +35,7 @@ public enum ResourceType {
RemoteProcessGroup("/remote-process-groups"),
ReportingTask("/reporting-tasks"),
FlowAnalysisRule("/controller/flow-analysis-rules"),
+ RegistryClient("/controller/registry-clients"),
Resource("/resources"),
SiteToSite("/site-to-site"),
DataTransfer("/data-transfer"),
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/registry/flow/StandardFlowRegistryClientNode.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/registry/flow/StandardFlowRegistryClientNode.java
index 8b968d3f2e..bf4398f271 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/registry/flow/StandardFlowRegistryClientNode.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/registry/flow/StandardFlowRegistryClientNode.java
@@ -99,7 +99,7 @@ public final class StandardFlowRegistryClientNode extends
AbstractComponentNode
@Override
public Resource getResource() {
- return ResourceFactory.getComponentResource(ResourceType.Controller,
getIdentifier(), getName());
+ return
ResourceFactory.getComponentResource(ResourceType.RegistryClient,
getIdentifier(), getName());
}
@Override
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
index a41334bd6c..a780e5f22b 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
@@ -644,6 +644,9 @@ public class StandardAuthorizableLookup implements
AuthorizableLookup {
case ProcessGroup:
authorizable = getProcessGroup(componentId).getAuthorizable();
break;
+ case RegistryClient:
+ authorizable =
getFlowRegistryClient(componentId).getAuthorizable();
+ break;
case RemoteProcessGroup:
authorizable = getRemoteProcessGroup(componentId);
break;
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java
index e0d662caac..f2afba9242 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java
@@ -1443,7 +1443,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Read - /flow")
+ @SecurityRequirement(name = "Read - /controller")
}
)
public Response getFlowRegistryClients() {
@@ -1481,6 +1481,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
+ @SecurityRequirement(name = "Read - /controller"),
@SecurityRequirement(name = "Write - /controller")
}
)
@@ -1569,7 +1570,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Read - /controller")
+ @SecurityRequirement(name = "Read -
/controller/registry-clients/{id}")
}
)
public Response getFlowRegistryClient(
@@ -1584,7 +1585,10 @@ public class ControllerResource extends
ApplicationResource {
}
// authorize access
- authorizeController(RequestAction.READ);
+ serviceFacade.authorizeAccess(lookup -> {
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.READ,
NiFiUserUtils.getNiFiUser());
+ });
// get the flow registry client
final FlowRegistryClientEntity entity =
serviceFacade.getRegistryClient(id);
@@ -1613,7 +1617,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Write - /controller")
+ @SecurityRequirement(name = "Write -
/controller/registry-clients/{id}")
}
)
public Response updateFlowRegistryClient(
@@ -1635,8 +1639,11 @@ public class ControllerResource extends
ApplicationResource {
throw new IllegalArgumentException("Revision must be specified.");
}
- // authorize access
- authorizeController(RequestAction.WRITE);
+ // Authorize Read before Write Action
+ serviceFacade.authorizeAccess(lookup -> {
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.READ,
NiFiUserUtils.getNiFiUser());
+ });
// ensure the ids are the same
final FlowRegistryClientDTO requestRegistryClient =
requestFlowRegistryClientEntity.getComponent();
@@ -1662,7 +1669,8 @@ public class ControllerResource extends
ApplicationResource {
requestFlowRegistryClientEntity,
requestRevision,
lookup -> {
- authorizeController(RequestAction.WRITE);
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.WRITE,
NiFiUserUtils.getNiFiUser());
},
null,
(revision, registryClientEntity) -> {
@@ -1702,7 +1710,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Write - /controller")
+ @SecurityRequirement(name = "Write -
/controller/registry-clients/{id}")
}
)
public Response deleteFlowRegistryClient(
@@ -1731,7 +1739,10 @@ public class ControllerResource extends
ApplicationResource {
}
// authorize access
- authorizeController(RequestAction.WRITE);
+ serviceFacade.authorizeAccess(lookup -> {
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.WRITE,
NiFiUserUtils.getNiFiUser());
+ });
final FlowRegistryClientEntity requestFlowRegistryClientEntity = new
FlowRegistryClientEntity();
requestFlowRegistryClientEntity.setId(id);
@@ -1743,7 +1754,8 @@ public class ControllerResource extends
ApplicationResource {
requestFlowRegistryClientEntity,
requestRevision,
lookup -> {
- authorizeController(RequestAction.WRITE);
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.WRITE,
NiFiUserUtils.getNiFiUser());
},
() -> serviceFacade.verifyDeleteRegistry(id),
(revision, registryClientEntity) -> {
@@ -1776,7 +1788,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Read -
/controller/registry-clients/{uuid}")
+ @SecurityRequirement(name = "Read -
/controller/registry-clients/{id}")
}
)
public Response getPropertyDescriptor(
@@ -1804,7 +1816,10 @@ public class ControllerResource extends
ApplicationResource {
}
// authorize access
- authorizeController(RequestAction.READ);
+ serviceFacade.authorizeAccess(lookup -> {
+ final Authorizable authorizable =
lookup.getFlowRegistryClient(id).getAuthorizable();
+ authorizable.authorize(authorizer, RequestAction.READ,
NiFiUserUtils.getNiFiUser());
+ });
// get the property descriptor
final PropertyDescriptorDTO descriptor =
serviceFacade.getRegistryClientPropertyDescriptor(id, propertyName, sensitive);
@@ -1837,7 +1852,7 @@ public class ControllerResource extends
ApplicationResource {
@ApiResponse(responseCode = "409", description = "The
request was valid but NiFi was not in the appropriate state to process it.")
},
security = {
- @SecurityRequirement(name = "Read - /flow")
+ @SecurityRequirement(name = "Read - /controller")
}
)
public Response getRegistryClientTypes() {