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 119f8881fb NIFI-15567 Streamlined Component Authorizable Evaluation 
Methods
119f8881fb is described below

commit 119f8881fbc3cbd0d522b0c549b841da3de01f64
Author: exceptionfactory <[email protected]>
AuthorDate: Sat Feb 7 09:52:21 2026 -0600

    NIFI-15567 Streamlined Component Authorizable Evaluation Methods
    
    - Added AuthorizeComponentReference class with shared methods for 
evaluating authorized configuration operations and referenced Controller 
Services
    - Updated create and update operations for Components using shared methods
    
    This closes #10871.
    
    Signed-off-by: Pierre Villard <[email protected]>
---
 .../authorization/AuthorizeComponentReference.java | 86 +++++++++++++++++++++
 .../authorization/AuthorizeParameterReference.java | 22 ------
 .../web/StandardNiFiWebConfigurationContext.java   | 30 +++-----
 .../apache/nifi/web/api/ControllerResource.java    | 88 ++++++----------------
 .../nifi/web/api/ControllerServiceResource.java    |  9 +--
 .../nifi/web/api/ParameterProviderResource.java    |  6 +-
 .../apache/nifi/web/api/ProcessGroupResource.java  | 54 +++----------
 .../org/apache/nifi/web/api/ProcessorResource.java |  9 +--
 .../apache/nifi/web/api/ReportingTaskResource.java |  7 +-
 .../AuthorizeComponentReferenceTest.java           | 82 ++++++++++++++++++++
 10 files changed, 229 insertions(+), 164 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeComponentReference.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeComponentReference.java
new file mode 100644
index 0000000000..5de5d8ccd9
--- /dev/null
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeComponentReference.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.authorization;
+
+import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.user.NiFiUser;
+import org.apache.nifi.authorization.user.NiFiUserUtils;
+import org.apache.nifi.web.api.dto.BundleDTO;
+
+import java.util.Map;
+
+public final class AuthorizeComponentReference {
+    /**
+     * Authorize configuration of specified Component Type including 
restrictions and referenced Controller Services
+     *
+     * @param authorizer Authorizer responsible for handling decisions
+     * @param authorizableLookup Authorizable Lookup for resolving referenced 
Controller Services
+     * @param componentType Component Type to be evaluated
+     * @param componentBundle Component Bundle to be evaluated
+     * @param properties Component configuration properties or null when not 
available for evaluation
+     * @param parameterContext Parameter Context or null when not available 
for evaluation
+     */
+    public static void authorizeComponentConfiguration(
+            final Authorizer authorizer,
+            final AuthorizableLookup authorizableLookup,
+            final String componentType,
+            final BundleDTO componentBundle,
+            final Map<String, String> properties,
+            final Authorizable parameterContext
+    ) {
+        ComponentAuthorizable authorizable = null;
+        try {
+            authorizable = 
authorizableLookup.getConfigurableComponent(componentType, componentBundle);
+            authorizeComponentConfiguration(authorizer, authorizableLookup, 
authorizable, properties, parameterContext);
+        } finally {
+            if (authorizable != null) {
+                authorizable.cleanUpResources();
+            }
+        }
+    }
+
+    /**
+     * Authorize configuration of specified Component including restrictions 
and referenced Controller Services
+     *
+     * @param authorizer Authorizer responsible for handling decisions
+     * @param authorizableLookup Authorizable Lookup for resolving referenced 
Controller Services
+     * @param componentAuthorizable Component Authorizable to be evaluated
+     * @param properties Component configuration properties required
+     * @param parameterContext Parameter Context or null when not available 
for evaluation
+     */
+    public static void authorizeComponentConfiguration(
+            final Authorizer authorizer,
+            final AuthorizableLookup authorizableLookup,
+            final ComponentAuthorizable componentAuthorizable,
+            final Map<String, String> properties,
+            final Authorizable parameterContext
+    ) {
+        final NiFiUser user = NiFiUserUtils.getNiFiUser();
+
+        if (componentAuthorizable.isRestricted()) {
+            
componentAuthorizable.getRestrictedAuthorizables().forEach(restrictionAuthorizable
 ->
+                    restrictionAuthorizable.authorize(authorizer, 
RequestAction.WRITE, user)
+            );
+        }
+
+        
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 componentAuthorizable, authorizer, authorizableLookup);
+
+        if (parameterContext != null) {
+            
AuthorizeParameterReference.authorizeParameterReferences(properties, 
authorizer, parameterContext, user);
+        }
+    }
+}
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeParameterReference.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeParameterReference.java
index 2bf08f7044..e6a33bf308 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeParameterReference.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizeParameterReference.java
@@ -28,10 +28,6 @@ import org.apache.nifi.parameter.ParameterDescriptor;
 import org.apache.nifi.parameter.ParameterParser;
 import org.apache.nifi.parameter.ParameterTokenList;
 import org.apache.nifi.web.NiFiServiceFacade;
-import org.apache.nifi.web.api.dto.ControllerServiceDTO;
-import org.apache.nifi.web.api.dto.FlowSnippetDTO;
-import org.apache.nifi.web.api.dto.ProcessorConfigDTO;
-import org.apache.nifi.web.api.dto.ProcessorDTO;
 
 import java.util.List;
 import java.util.Map;
@@ -105,24 +101,6 @@ public class AuthorizeParameterReference {
         }
     }
 
-    public static void authorizeParameterReferences(final FlowSnippetDTO 
flowSnippet, final Authorizer authorizer, final Authorizable 
parameterContextAuthorizable, final NiFiUser user) {
-        for (final ProcessorDTO processorDto : flowSnippet.getProcessors()) {
-            final ProcessorConfigDTO configDto = processorDto.getConfig();
-            if (configDto == null) {
-                continue;
-            }
-
-            authorizeParameterReferences(configDto.getProperties(), 
authorizer, parameterContextAuthorizable, user);
-        }
-
-        for (final ControllerServiceDTO serviceDto : 
flowSnippet.getControllerServices()) {
-            authorizeParameterReferences(serviceDto.getProperties(), 
authorizer, parameterContextAuthorizable, user);
-        }
-
-        // Note: there is no need to recurse here because when a snippet is 
instantiated, if there are any components in child Process Groups, a new 
Process Group will be created
-        // without any Parameter Context, so there is no need to perform any 
authorization beyond the top-level group where the instantiation is occurring.
-    }
-
     /**
      * If any parameter is referenced by the given component node, will 
authorize user against the given group's Parameter context
      * @param destinationGroup the group that the component is being moved to
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
index ea13e2322e..4ab69b13ae 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
@@ -31,7 +31,7 @@ import org.apache.nifi.action.StandardRequestDetails;
 import org.apache.nifi.action.component.details.FlowChangeExtensionDetails;
 import org.apache.nifi.action.details.FlowChangeConfigureDetails;
 import org.apache.nifi.admin.service.AuditService;
-import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeParameterReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
@@ -48,6 +48,7 @@ import org.apache.nifi.cluster.protocol.NodeIdentifier;
 import org.apache.nifi.controller.ControllerService;
 import org.apache.nifi.controller.reporting.ReportingTaskProvider;
 import org.apache.nifi.controller.service.ControllerServiceProvider;
+import org.apache.nifi.parameter.ParameterContext;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.web.api.ApplicationResource.ReplicationTarget;
 import org.apache.nifi.web.api.dto.AllowableValueDTO;
@@ -424,12 +425,9 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 final ComponentAuthorizable authorizable = 
lookup.getProcessor(id);
                 authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                // authorize any referenced service
-                
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 authorizable, authorizer, lookup);
-
-                // authorize any parameter references
-                
AuthorizeParameterReference.authorizeParameterReferences(properties, 
authorizer, authorizable.getParameterContext(), user);
-                
AuthorizeParameterReference.authorizeParameterReferences(annotationData, 
authorizer, authorizable.getParameterContext(), user);
+                final ParameterContext parameterContext = 
authorizable.getParameterContext();
+                
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, parameterContext);
+                
AuthorizeParameterReference.authorizeParameterReferences(annotationData, 
authorizer, parameterContext, user);
             });
 
             ProcessorEntity entity;
@@ -609,12 +607,9 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 final ComponentAuthorizable authorizable = 
lookup.getControllerService(id);
                 authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                // authorize any referenced service
-                
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 authorizable, authorizer, lookup);
-
-                // authorize any parameter references
-                
AuthorizeParameterReference.authorizeParameterReferences(properties, 
authorizer, authorizable.getParameterContext(), user);
-                
AuthorizeParameterReference.authorizeParameterReferences(annotationData, 
authorizer, authorizable.getParameterContext(), user);
+                final ParameterContext parameterContext = 
authorizable.getParameterContext();
+                
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, parameterContext);
+                
AuthorizeParameterReference.authorizeParameterReferences(annotationData, 
authorizer, parameterContext, user);
             });
 
             ControllerServiceEntity entity;
@@ -757,8 +752,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
                 final ComponentAuthorizable authorizable = 
lookup.getReportingTask(id);
                 authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                // authorize any referenced service
-                
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 authorizable, authorizer, lookup);
+                
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, null);
             });
 
             ReportingTaskEntity entity;
@@ -902,8 +896,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
                 final ComponentAuthorizable authorizable = 
lookup.getParameterProvider(id);
                 authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                // authorize any referenced service
-                
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 authorizable, authorizer, lookup);
+                
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, null);
             });
 
             ParameterProviderEntity entity;
@@ -1046,8 +1039,7 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 final ComponentAuthorizable authorizable = 
lookup.getParameterProvider(id);
                 authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                // authorize any referenced service
-                
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties,
 authorizable, authorizer, lookup);
+                
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, null);
             });
 
             FlowRegistryClientEntity entity;
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 c54e0666ca..fc18ed3999 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
@@ -40,6 +40,7 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.StreamingOutput;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
@@ -69,6 +70,7 @@ import 
org.apache.nifi.web.api.concurrent.StandardAsynchronousWebRequest;
 import org.apache.nifi.web.api.concurrent.StandardUpdateStep;
 import org.apache.nifi.web.api.concurrent.UpdateStep;
 import org.apache.nifi.web.api.dto.BulletinDTO;
+import org.apache.nifi.web.api.dto.BundleDTO;
 import org.apache.nifi.web.api.dto.ClusterDTO;
 import org.apache.nifi.web.api.dto.ComponentStateDTO;
 import org.apache.nifi.web.api.dto.ConfigVerificationResultDTO;
@@ -126,6 +128,7 @@ import java.time.Instant;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
@@ -322,22 +325,10 @@ public class ControllerResource extends 
ApplicationResource {
                 lookup -> {
                     authorizeController(RequestAction.WRITE);
 
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestParameterProvider.getType(), 
requestParameterProvider.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        if (requestParameterProvider.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestParameterProvider.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final String componentType = 
requestParameterProvider.getType();
+                    final BundleDTO bundle = 
requestParameterProvider.getBundle();
+                    final Map<String, String> properties = 
requestParameterProvider.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, null);
                 },
                 () -> 
serviceFacade.verifyCreateParameterProvider(requestParameterProvider),
                 (parameterProviderEntity) -> {
@@ -485,22 +476,10 @@ public class ControllerResource extends 
ApplicationResource {
                 lookup -> {
                     authorizeController(RequestAction.WRITE);
 
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestReportingTask.getType(), 
requestReportingTask.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        if (requestReportingTask.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestReportingTask.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final String componentType = 
requestReportingTask.getType();
+                    final BundleDTO bundle = requestReportingTask.getBundle();
+                    final Map<String, String> properties = 
requestReportingTask.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, null);
                 },
                 () -> 
serviceFacade.verifyCreateReportingTask(requestReportingTask),
                 (reportingTaskEntity) -> {
@@ -649,22 +628,10 @@ public class ControllerResource extends 
ApplicationResource {
                 lookup -> {
                     authorizeController(RequestAction.WRITE);
 
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestFlowAnalysisRule.getType(), 
requestFlowAnalysisRule.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        if (requestFlowAnalysisRule.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestFlowAnalysisRule.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final String componentType = 
requestFlowAnalysisRule.getType();
+                    final BundleDTO bundle = 
requestFlowAnalysisRule.getBundle();
+                    final Map<String, String> properties = 
requestFlowAnalysisRule.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, null);
                 },
                 () -> 
serviceFacade.verifyCreateFlowAnalysisRule(requestFlowAnalysisRule),
                 (flowAnalysisRuleEntity) -> {
@@ -819,9 +786,8 @@ public class ControllerResource extends ApplicationResource 
{
                     authorizeController(RequestAction.WRITE);
 
                     final ComponentAuthorizable authorizable = 
lookup.getFlowAnalysisRule(id);
-
-                    // authorize any referenced services
-                    
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestFlowAnalysisRuleDTO.getProperties(),
 authorizable, authorizer, lookup);
+                    final Map<String, String> componentProperties = 
requestFlowAnalysisRuleDTO.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, componentProperties, null);
                 },
                 () -> 
serviceFacade.verifyUpdateFlowAnalysisRule(requestFlowAnalysisRuleDTO),
                 (revision, flowAnalysisRuleEntity) -> {
@@ -2501,22 +2467,10 @@ public class ControllerResource extends 
ApplicationResource {
                 lookup -> {
                     authorizeController(RequestAction.WRITE);
 
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestControllerService.getType(), 
requestControllerService.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        if (requestControllerService.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestControllerService.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final String componentType = 
requestControllerService.getType();
+                    final BundleDTO bundle = 
requestControllerService.getBundle();
+                    final Map<String, String> properties = 
requestControllerService.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, null);
                 },
                 () -> 
serviceFacade.verifyCreateControllerService(requestControllerService),
                 (controllerServiceEntity) -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
index f0d2343f46..8377891a3e 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
@@ -39,8 +39,8 @@ import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
-import org.apache.nifi.authorization.AuthorizeParameterReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
 import org.apache.nifi.authorization.RequestAction;
@@ -730,10 +730,9 @@ public class ControllerServiceResource extends 
ApplicationResource {
                     final ComponentAuthorizable authorizable = 
lookup.getControllerService(id);
                     authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                    // authorize any referenced services
-                    
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestControllerServiceDTO.getProperties(),
 authorizable, authorizer, lookup);
-                    
AuthorizeParameterReference.authorizeParameterReferences(requestControllerServiceDTO.getProperties(),
 authorizer, authorizable.getParameterContext(),
-                            NiFiUserUtils.getNiFiUser());
+                    final Map<String, String> properties = 
requestControllerServiceDTO.getProperties();
+                    final Authorizable parameterContext = 
authorizable.getParameterContext();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, parameterContext);
                 },
                 () -> 
serviceFacade.verifyUpdateControllerService(requestControllerServiceDTO),
                 (revision, controllerServiceEntity) -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
index 2430e85421..809243b9e4 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
@@ -42,6 +42,7 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.authorization.AuthorizableLookup;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
@@ -645,8 +646,9 @@ public class ParameterProviderResource extends 
AbstractParameterResource {
                     final ComponentAuthorizable authorizable = 
lookup.getParameterProvider(id);
                     authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                    // authorize any referenced services
-                    
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestParameterProviderDTO.getProperties(),
 authorizable, authorizer, lookup);
+                    final Authorizable parameterContext = 
authorizable.getParameterContext();
+                    final Map<String, String> componentProperties = 
requestParameterProviderDTO.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, componentProperties, parameterContext);
                 },
                 () -> 
serviceFacade.verifyUpdateParameterProvider(requestParameterProviderDTO),
                 (revision, parameterProviderEntity) -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
index 1d5692b817..43b496f39c 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
@@ -45,6 +45,7 @@ import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.UriBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.authorization.AuthorizableLookup;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
 import org.apache.nifi.authorization.AuthorizeParameterProviders;
 import org.apache.nifi.authorization.AuthorizeParameterReference;
@@ -80,6 +81,7 @@ import org.apache.nifi.web.ResourceNotFoundException;
 import org.apache.nifi.web.Revision;
 import org.apache.nifi.web.api.concurrent.AsyncRequestManager;
 import org.apache.nifi.web.api.concurrent.RequestManager;
+import org.apache.nifi.web.api.dto.BundleDTO;
 import org.apache.nifi.web.api.dto.ConnectionDTO;
 import org.apache.nifi.web.api.dto.ControllerServiceDTO;
 import org.apache.nifi.web.api.dto.DropRequestDTO;
@@ -136,6 +138,7 @@ import org.springframework.stereotype.Controller;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -1313,28 +1316,11 @@ public class ProcessGroupResource extends 
FlowUpdateResource<ProcessGroupImportE
                     processGroup.authorize(authorizer, RequestAction.WRITE, 
user);
 
                     final Authorizable parameterContext = 
groupAuthorizable.getProcessGroup().getParameterContext();
-                    final ProcessorConfigDTO configDto = 
requestProcessor.getConfig();
-                    if (parameterContext != null && configDto != null) {
-                        
AuthorizeParameterReference.authorizeParameterReferences(configDto.getProperties(),
 authorizer, parameterContext, user);
-                    }
-
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestProcessor.getType(), 
requestProcessor.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        final ProcessorConfigDTO config = 
requestProcessor.getConfig();
-                        if (config != null && config.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(config.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final ProcessorConfigDTO config = 
requestProcessor.getConfig();
+                    final Map<String, String> properties = config == null ? 
Collections.emptyMap() : config.getProperties();
+                    final String componentType = requestProcessor.getType();
+                    final BundleDTO bundle = requestProcessor.getBundle();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, parameterContext);
                 },
                 () -> serviceFacade.verifyCreateProcessor(requestProcessor),
                 processorEntity -> {
@@ -2541,26 +2527,10 @@ public class ProcessGroupResource extends 
FlowUpdateResource<ProcessGroupImportE
                     processGroup.authorize(authorizer, RequestAction.WRITE, 
user);
 
                     final Authorizable parameterContext = 
groupAuthorizable.getProcessGroup().getParameterContext();
-                    if (parameterContext != null) {
-                        
AuthorizeParameterReference.authorizeParameterReferences(requestControllerService.getProperties(),
 authorizer, parameterContext, user);
-                    }
-
-                    ComponentAuthorizable authorizable = null;
-                    try {
-                        authorizable = 
lookup.getConfigurableComponent(requestControllerService.getType(), 
requestControllerService.getBundle());
-
-                        if (authorizable.isRestricted()) {
-                            authorizeRestrictions(authorizer, authorizable);
-                        }
-
-                        if (requestControllerService.getProperties() != null) {
-                            
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestControllerService.getProperties(),
 authorizable, authorizer, lookup);
-                        }
-                    } finally {
-                        if (authorizable != null) {
-                            authorizable.cleanUpResources();
-                        }
-                    }
+                    final String componentType = 
requestControllerService.getType();
+                    final BundleDTO bundle = 
requestControllerService.getBundle();
+                    final Map<String, String> properties = 
requestControllerService.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
componentType, bundle, properties, parameterContext);
                 },
                 () -> 
serviceFacade.verifyCreateControllerService(requestControllerService),
                 controllerServiceEntity -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
index b7a4873a56..0870cc7922 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
@@ -39,8 +39,8 @@ import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
-import org.apache.nifi.authorization.AuthorizeParameterReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
 import org.apache.nifi.authorization.RequestAction;
@@ -946,10 +946,9 @@ public class ProcessorResource extends ApplicationResource 
{
                     authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, user);
 
                     final ProcessorConfigDTO config = 
requestProcessorDTO.getConfig();
-                    if (config != null) {
-                        
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(config.getProperties(),
 authorizable, authorizer, lookup);
-                        
AuthorizeParameterReference.authorizeParameterReferences(config.getProperties(),
 authorizer, authorizable.getParameterContext(), user);
-                    }
+                    final Map<String, String> properties = config == null ? 
Collections.emptyMap() : config.getProperties();
+                    final Authorizable parameterContext = 
authorizable.getParameterContext();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, properties, parameterContext);
                 },
                 () -> serviceFacade.verifyUpdateProcessor(requestProcessorDTO),
                 (revision, processorEntity) -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
index d08de6ba60..69df60459c 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
@@ -39,6 +39,7 @@ import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.authorization.AuthorizeComponentReference;
 import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.ComponentAuthorizable;
@@ -84,6 +85,7 @@ import org.springframework.stereotype.Controller;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -536,8 +538,9 @@ public class ReportingTaskResource extends 
ApplicationResource {
                     final ComponentAuthorizable authorizable = 
lookup.getReportingTask(id);
                     authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
 
-                    // authorize any referenced services
-                    
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(requestReportingTaskDTO.getProperties(),
 authorizable, authorizer, lookup);
+                    final Authorizable parameterContext = 
authorizable.getParameterContext();
+                    final Map<String, String> componentProperties = 
requestReportingTaskDTO.getProperties();
+                    
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, lookup, 
authorizable, componentProperties, parameterContext);
                 },
                 () -> 
serviceFacade.verifyUpdateReportingTask(requestReportingTaskDTO),
                 (revision, reportingTaskEntity) -> {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/AuthorizeComponentReferenceTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/AuthorizeComponentReferenceTest.java
new file mode 100644
index 0000000000..6aa694bbda
--- /dev/null
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/AuthorizeComponentReferenceTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.authorization;
+
+import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.web.api.dto.BundleDTO;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Map;
+import java.util.Set;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class AuthorizeComponentReferenceTest {
+    private static final String COMPONENT_TYPE = 
ComponentAuthorizable.class.getName();
+
+    private static final BundleDTO COMPONENT_BUNDLE = new BundleDTO();
+
+    @Mock
+    private Authorizer authorizer;
+
+    @Mock
+    private AuthorizableLookup authorizableLookup;
+
+    @Mock
+    private ComponentAuthorizable componentAuthorizable;
+
+    @Mock
+    private Authorizable restrictedAuthorizable;
+
+    @Mock
+    private Authorizable parameterContext;
+
+    @Test
+    void testAuthorizeComponentConfigurationComponentType() {
+        when(authorizableLookup.getConfigurableComponent(eq(COMPONENT_TYPE), 
eq(COMPONENT_BUNDLE))).thenReturn(componentAuthorizable);
+
+        
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, 
authorizableLookup, COMPONENT_TYPE, COMPONENT_BUNDLE, Map.of(), 
parameterContext);
+
+        verify(componentAuthorizable).cleanUpResources();
+    }
+
+    @Test
+    void testAuthorizeComponentConfigurationComponentAuthorizable() {
+        
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, 
authorizableLookup, componentAuthorizable, Map.of(), parameterContext);
+
+        verify(componentAuthorizable, never()).cleanUpResources();
+    }
+
+    @Test
+    void testAuthorizeComponentConfigurationRestricted() {
+        when(componentAuthorizable.isRestricted()).thenReturn(true);
+        
when(componentAuthorizable.getRestrictedAuthorizables()).thenReturn(Set.of(restrictedAuthorizable));
+
+        
AuthorizeComponentReference.authorizeComponentConfiguration(authorizer, 
authorizableLookup, componentAuthorizable, null, null);
+
+        verify(restrictedAuthorizable).authorize(eq(authorizer), 
eq(RequestAction.WRITE), any());
+        verify(componentAuthorizable, never()).cleanUpResources();
+    }
+}


Reply via email to