You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2016/04/29 22:32:23 UTC

[10/13] nifi git commit: NIFI-1554: - Populating component entities in the REST API to decouple key fields from the configuration DTOs. - Added initial support for components in UI when access isn't allowed. Formal styling to come later.

http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
index 67f24e1..ba9d0ff 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
@@ -34,7 +34,6 @@ import org.apache.nifi.web.api.dto.CountersDTO;
 import org.apache.nifi.web.api.dto.DocumentedTypeDTO;
 import org.apache.nifi.web.api.dto.DropRequestDTO;
 import org.apache.nifi.web.api.dto.FlowFileDTO;
-import org.apache.nifi.web.api.dto.FlowSnippetDTO;
 import org.apache.nifi.web.api.dto.FunnelDTO;
 import org.apache.nifi.web.api.dto.LabelDTO;
 import org.apache.nifi.web.api.dto.ListingRequestDTO;
@@ -54,6 +53,8 @@ import org.apache.nifi.web.api.dto.TemplateDTO;
 import org.apache.nifi.web.api.dto.action.ActionDTO;
 import org.apache.nifi.web.api.dto.action.HistoryDTO;
 import org.apache.nifi.web.api.dto.action.HistoryQueryDTO;
+import org.apache.nifi.web.api.dto.flow.FlowDTO;
+import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceOptionsDTO;
@@ -66,6 +67,13 @@ import org.apache.nifi.web.api.dto.status.ProcessGroupStatusDTO;
 import org.apache.nifi.web.api.dto.status.ProcessorStatusDTO;
 import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusDTO;
 import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
+import org.apache.nifi.web.api.entity.ConnectionEntity;
+import org.apache.nifi.web.api.entity.FunnelEntity;
+import org.apache.nifi.web.api.entity.LabelEntity;
+import org.apache.nifi.web.api.entity.PortEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
+import org.apache.nifi.web.api.entity.ProcessorEntity;
+import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity;
 
 import java.util.Date;
 import java.util.List;
@@ -318,7 +326,7 @@ public interface NiFiServiceFacade {
      * @param originY y
      * @return snapshot
      */
-    ConfigurationSnapshot<FlowSnippetDTO> createTemplateInstance(Revision revision, String groupId, Double originX, Double originY, String templateId);
+    ConfigurationSnapshot<FlowDTO> createTemplateInstance(Revision revision, String groupId, Double originX, Double originY, String templateId);
 
     /**
      * Gets the template with the specified id.
@@ -361,7 +369,7 @@ public interface NiFiServiceFacade {
      * @param processorDTO The processor DTO
      * @return The new processor DTO
      */
-    ConfigurationSnapshot<ProcessorDTO> createProcessor(Revision revision, String groupId, ProcessorDTO processorDTO);
+    ProcessorEntity createProcessor(Revision revision, String groupId, ProcessorDTO processorDTO);
 
     /**
      * Gets the Processor transfer object for the specified id.
@@ -369,7 +377,7 @@ public interface NiFiServiceFacade {
      * @param id Id of the processor to return
      * @return The Processor transfer object
      */
-    ProcessorDTO getProcessor(String id);
+    ProcessorEntity getProcessor(String id);
 
     /**
      * Gets the processor status.
@@ -402,7 +410,7 @@ public interface NiFiServiceFacade {
      * @param groupId group
      * @return List of all the Processor transfer object
      */
-    Set<ProcessorDTO> getProcessors(String groupId);
+    Set<ProcessorEntity> getProcessors(String groupId);
 
     /**
      * Verifies the specified processor can be updated.
@@ -418,7 +426,7 @@ public interface NiFiServiceFacade {
      * @param processorDTO The processorDTO
      * @return The updated processor
      */
-    ConfigurationSnapshot<ProcessorDTO> updateProcessor(Revision revision, ProcessorDTO processorDTO);
+    UpdateResult<ProcessorEntity> updateProcessor(Revision revision, ProcessorDTO processorDTO);
 
     /**
      * Verifies the specified processor can be removed.
@@ -434,7 +442,7 @@ public interface NiFiServiceFacade {
      * @param processorId The processor id to delete
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteProcessor(Revision revision, String processorId);
+    ProcessorEntity deleteProcessor(Revision revision, String processorId);
 
     // ----------------------------------------
     // Connections methods
@@ -446,7 +454,7 @@ public interface NiFiServiceFacade {
      * @param groupId group
      * @return The Connection transfer objects
      */
-    Set<ConnectionDTO> getConnections(String groupId);
+    Set<ConnectionEntity> getConnections(String groupId);
 
     /**
      * Gets the specified Connection transfer object.
@@ -454,7 +462,7 @@ public interface NiFiServiceFacade {
      * @param connectionId The ID of the connection
      * @return The Connection transfer object
      */
-    ConnectionDTO getConnection(String connectionId);
+    ConnectionEntity getConnection(String connectionId);
 
     /**
      * Gets the status of the specified connection.
@@ -480,7 +488,7 @@ public interface NiFiServiceFacade {
      * @param connectionDTO The Connection DTO
      * @return The Connection DTO
      */
-    ConfigurationSnapshot<ConnectionDTO> createConnection(Revision revision, String groupId, ConnectionDTO connectionDTO);
+    ConnectionEntity createConnection(Revision revision, String groupId, ConnectionDTO connectionDTO);
 
     /**
      * Determines if this connection can be listed.
@@ -511,7 +519,7 @@ public interface NiFiServiceFacade {
      * @param connectionDTO The Connection DTO
      * @return The Connection DTO
      */
-    ConfigurationSnapshot<ConnectionDTO> updateConnection(Revision revision, ConnectionDTO connectionDTO);
+    UpdateResult<ConnectionEntity> updateConnection(Revision revision, ConnectionDTO connectionDTO);
 
     /**
      * Determines if this connection can be removed.
@@ -527,7 +535,7 @@ public interface NiFiServiceFacade {
      * @param connectionId The ID of the connection
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteConnection(Revision revision, String connectionId);
+    ConnectionEntity deleteConnection(Revision revision, String connectionId);
 
     /**
      * Creates a new flow file drop request.
@@ -603,7 +611,7 @@ public interface NiFiServiceFacade {
      * @param inputPortDTO The input PortDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<PortDTO> createInputPort(Revision revision, String groupId, PortDTO inputPortDTO);
+    PortEntity createInputPort(Revision revision, String groupId, PortDTO inputPortDTO);
 
     /**
      * Gets an input port.
@@ -611,7 +619,7 @@ public interface NiFiServiceFacade {
      * @param inputPortId The input port id
      * @return port
      */
-    PortDTO getInputPort(String inputPortId);
+    PortEntity getInputPort(String inputPortId);
 
     /**
      * Gets all input ports in a given group.
@@ -619,7 +627,7 @@ public interface NiFiServiceFacade {
      * @param groupId The id of the group
      * @return port
      */
-    Set<PortDTO> getInputPorts(String groupId);
+    Set<PortEntity> getInputPorts(String groupId);
 
     /**
      * Gets the input port status.
@@ -643,7 +651,7 @@ public interface NiFiServiceFacade {
      * @param inputPortDTO The input PortDTO
      * @return snapshort
      */
-    ConfigurationSnapshot<PortDTO> updateInputPort(Revision revision, PortDTO inputPortDTO);
+    UpdateResult<PortEntity> updateInputPort(Revision revision, PortDTO inputPortDTO);
 
     /**
      * Determines if the input port could be deleted.
@@ -659,7 +667,7 @@ public interface NiFiServiceFacade {
      * @param inputPortId The id of the input port
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteInputPort(Revision revision, String inputPortId);
+    PortEntity deleteInputPort(Revision revision, String inputPortId);
 
     // ----------------------------------------
     // OutputPort methods
@@ -672,7 +680,7 @@ public interface NiFiServiceFacade {
      * @param outputPortDTO The output PortDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<PortDTO> createOutputPort(Revision revision, String groupId, PortDTO outputPortDTO);
+    PortEntity createOutputPort(Revision revision, String groupId, PortDTO outputPortDTO);
 
     /**
      * Gets an output port.
@@ -680,7 +688,7 @@ public interface NiFiServiceFacade {
      * @param outputPortId The output port id
      * @return port
      */
-    PortDTO getOutputPort(String outputPortId);
+    PortEntity getOutputPort(String outputPortId);
 
     /**
      * Gets all output ports in a given group.
@@ -688,7 +696,7 @@ public interface NiFiServiceFacade {
      * @param groupId The id of the group
      * @return ports
      */
-    Set<PortDTO> getOutputPorts(String groupId);
+    Set<PortEntity> getOutputPorts(String groupId);
 
     /**
      * Gets the output port status.
@@ -712,7 +720,7 @@ public interface NiFiServiceFacade {
      * @param outputPortDTO The output PortDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<PortDTO> updateOutputPort(Revision revision, PortDTO outputPortDTO);
+    UpdateResult<PortEntity> updateOutputPort(Revision revision, PortDTO outputPortDTO);
 
     /**
      * Determines if the output port could be deleted.
@@ -728,7 +736,19 @@ public interface NiFiServiceFacade {
      * @param outputPortId The id of the output port
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteOutputPort(Revision revision, String outputPortId);
+    PortEntity deleteOutputPort(Revision revision, String outputPortId);
+
+    // ----------------------------------------
+    // Flow methods
+    // ----------------------------------------
+    /**
+     * Returns the flow.
+     *
+     * @param groupId group
+     * @param recurse recurse
+     * @return the flow
+     */
+    ConfigurationSnapshot<ProcessGroupFlowDTO> getProcessGroupFlow(String groupId, boolean recurse);
 
     // ----------------------------------------
     // ProcessGroup methods
@@ -741,16 +761,15 @@ public interface NiFiServiceFacade {
      * @param processGroupDTO The ProcessGroupDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<ProcessGroupDTO> createProcessGroup(String parentGroupId, Revision revision, ProcessGroupDTO processGroupDTO);
+    ProcessGroupEntity createProcessGroup(String parentGroupId, Revision revision, ProcessGroupDTO processGroupDTO);
 
     /**
      * Returns the process group.
      *
      * @param groupId group
-     * @param recurse recurse
      * @return ProcessGroup transfer object
      */
-    ConfigurationSnapshot<ProcessGroupDTO> getProcessGroup(String groupId, boolean recurse);
+    ProcessGroupEntity getProcessGroup(String groupId);
 
     /**
      * Gets all process groups in the specified parent group.
@@ -758,7 +777,7 @@ public interface NiFiServiceFacade {
      * @param parentGroupId The id of the parent group
      * @return process group
      */
-    Set<ProcessGroupDTO> getProcessGroups(String parentGroupId);
+    Set<ProcessGroupEntity> getProcessGroups(String parentGroupId);
 
     /**
      * Verifies the specified process group can be updated.
@@ -774,7 +793,7 @@ public interface NiFiServiceFacade {
      * @param processGroupDTO The ProcessGroupDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<ProcessGroupDTO> updateProcessGroup(Revision revision, ProcessGroupDTO processGroupDTO);
+    UpdateResult<ProcessGroupEntity> updateProcessGroup(Revision revision, ProcessGroupDTO processGroupDTO);
 
     /**
      * Verifies the specified process group can be removed.
@@ -790,7 +809,7 @@ public interface NiFiServiceFacade {
      * @param groupId The id of the process group
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteProcessGroup(Revision revision, String groupId);
+    ProcessGroupEntity deleteProcessGroup(Revision revision, String groupId);
 
     // ----------------------------------------
     // RemoteProcessGroup methods
@@ -803,7 +822,7 @@ public interface NiFiServiceFacade {
      * @param remoteProcessGroupDTO The RemoteProcessGroupDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<RemoteProcessGroupDTO> createRemoteProcessGroup(Revision revision, String groupId, RemoteProcessGroupDTO remoteProcessGroupDTO);
+    RemoteProcessGroupEntity createRemoteProcessGroup(Revision revision, String groupId, RemoteProcessGroupDTO remoteProcessGroupDTO);
 
     /**
      * Gets a remote process group.
@@ -811,7 +830,7 @@ public interface NiFiServiceFacade {
      * @param remoteProcessGroupId The id of the remote process group
      * @return group
      */
-    RemoteProcessGroupDTO getRemoteProcessGroup(String remoteProcessGroupId);
+    RemoteProcessGroupEntity getRemoteProcessGroup(String remoteProcessGroupId);
 
     /**
      * Gets all remote process groups in the a given parent group.
@@ -819,7 +838,7 @@ public interface NiFiServiceFacade {
      * @param groupId The id of the parent group
      * @return group
      */
-    Set<RemoteProcessGroupDTO> getRemoteProcessGroups(String groupId);
+    Set<RemoteProcessGroupEntity> getRemoteProcessGroups(String groupId);
 
     /**
      * Gets the remote process group status.
@@ -867,7 +886,7 @@ public interface NiFiServiceFacade {
      * @param remoteProcessGroupDTO The RemoteProcessGroupDTO
      * @return snapshot
      */
-    ConfigurationSnapshot<RemoteProcessGroupDTO> updateRemoteProcessGroup(Revision revision, RemoteProcessGroupDTO remoteProcessGroupDTO);
+    UpdateResult<RemoteProcessGroupEntity> updateRemoteProcessGroup(Revision revision, RemoteProcessGroupDTO remoteProcessGroupDTO);
 
     /**
      * Updates the specified remote process groups input port.
@@ -903,7 +922,7 @@ public interface NiFiServiceFacade {
      * @param remoteProcessGroupId The id of the remote process group
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteRemoteProcessGroup(Revision revision, String remoteProcessGroupId);
+    RemoteProcessGroupEntity deleteRemoteProcessGroup(Revision revision, String remoteProcessGroupId);
 
     // ----------------------------------------
     // Funnel methods
@@ -916,7 +935,7 @@ public interface NiFiServiceFacade {
      * @param funnelDTO funnel
      * @return The funnel DTO
      */
-    ConfigurationSnapshot<FunnelDTO> createFunnel(Revision revision, String groupId, FunnelDTO funnelDTO);
+    FunnelEntity createFunnel(Revision revision, String groupId, FunnelDTO funnelDTO);
 
     /**
      * Gets the specified funnel.
@@ -924,7 +943,7 @@ public interface NiFiServiceFacade {
      * @param funnelId The funnel id
      * @return The funnel transfer object
      */
-    FunnelDTO getFunnel(String funnelId);
+    FunnelEntity getFunnel(String funnelId);
 
     /**
      * Gets all of the funnels.
@@ -932,7 +951,7 @@ public interface NiFiServiceFacade {
      * @param groupId group
      * @return The funnel transfer objects
      */
-    Set<FunnelDTO> getFunnels(String groupId);
+    Set<FunnelEntity> getFunnels(String groupId);
 
     /**
      * Updates the specified label.
@@ -941,7 +960,7 @@ public interface NiFiServiceFacade {
      * @param funnelDTO The funnel DTO
      * @return The funnel DTO
      */
-    ConfigurationSnapshot<FunnelDTO> updateFunnel(Revision revision, FunnelDTO funnelDTO);
+    UpdateResult<FunnelEntity> updateFunnel(Revision revision, FunnelDTO funnelDTO);
 
     /**
      * Verifies the specified funnel can be deleted.
@@ -957,7 +976,7 @@ public interface NiFiServiceFacade {
      * @param funnelId The funnel id
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteFunnel(Revision revision, String funnelId);
+    FunnelEntity deleteFunnel(Revision revision, String funnelId);
 
     // ----------------------------------------
     // Component state methods
@@ -1046,7 +1065,7 @@ public interface NiFiServiceFacade {
      * @param labelDTO The label DTO
      * @return The label DTO
      */
-    ConfigurationSnapshot<LabelDTO> createLabel(Revision revision, String groupId, LabelDTO labelDTO);
+    LabelEntity createLabel(Revision revision, String groupId, LabelDTO labelDTO);
 
     /**
      * Gets the specified label.
@@ -1054,7 +1073,7 @@ public interface NiFiServiceFacade {
      * @param labelId The label id
      * @return The label transfer object
      */
-    LabelDTO getLabel(String labelId);
+    LabelEntity getLabel(String labelId);
 
     /**
      * Gets all of the labels.
@@ -1062,7 +1081,7 @@ public interface NiFiServiceFacade {
      * @param groupId group
      * @return The label transfer objects
      */
-    Set<LabelDTO> getLabels(String groupId);
+    Set<LabelEntity> getLabels(String groupId);
 
     /**
      * Updates the specified label.
@@ -1071,7 +1090,7 @@ public interface NiFiServiceFacade {
      * @param labelDTO The label DTO
      * @return The label DTO
      */
-    ConfigurationSnapshot<LabelDTO> updateLabel(Revision revision, LabelDTO labelDTO);
+    UpdateResult<LabelEntity> updateLabel(Revision revision, LabelDTO labelDTO);
 
     /**
      * Deletes the specified label.
@@ -1080,7 +1099,7 @@ public interface NiFiServiceFacade {
      * @param labelId The label id
      * @return snapshot
      */
-    ConfigurationSnapshot<Void> deleteLabel(Revision revision, String labelId);
+    LabelEntity deleteLabel(Revision revision, String labelId);
 
     // ----------------------------------------
     // Controller Services methods
@@ -1294,7 +1313,7 @@ public interface NiFiServiceFacade {
      * @param originY y
      * @return snapshot
      */
-    ConfigurationSnapshot<FlowSnippetDTO> copySnippet(Revision revision, String groupId, String snippetId, Double originX, Double originY);
+    ConfigurationSnapshot<FlowDTO> copySnippet(Revision revision, String groupId, String snippetId, Double originX, Double originY);
 
     /**
      * Creates a new snippet.

http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java
index 58b0af8..51fa7a2 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java
@@ -27,6 +27,7 @@ import org.springframework.context.annotation.ImportResource;
 @Import({NiFiWebApiSecurityConfiguration.class})
 @ImportResource({"classpath:nifi-context.xml",
     "classpath:nifi-administration-context.xml",
+    "classpath:nifi-framework-authorization-context.xml",
     "classpath:nifi-cluster-manager-context.xml",
     "classpath:nifi-cluster-protocol-context.xml",
     "classpath:nifi-web-security-context.xml",

http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java
index 66f1546..36db1d9 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java
@@ -20,6 +20,8 @@ import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.ClientResponse.Status;
 import com.sun.jersey.core.util.MultivaluedMapImpl;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.authorization.AccessDeniedException;
+import org.apache.nifi.authorization.user.NiFiUserDetails;
 import org.apache.nifi.cluster.manager.NodeResponse;
 import org.apache.nifi.cluster.manager.exception.UnknownNodeException;
 import org.apache.nifi.cluster.manager.impl.WebClusterManager;
@@ -27,11 +29,9 @@ import org.apache.nifi.cluster.node.Node;
 import org.apache.nifi.cluster.protocol.NodeIdentifier;
 import org.apache.nifi.controller.repository.claim.ContentDirection;
 import org.apache.nifi.util.NiFiProperties;
-import org.apache.nifi.web.security.user.NiFiUserDetails;
 import org.apache.nifi.web.util.WebUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index dae1ab6..b85c15d 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -24,7 +24,12 @@ import org.apache.nifi.action.Operation;
 import org.apache.nifi.action.details.FlowChangePurgeDetails;
 import org.apache.nifi.admin.service.AuditService;
 import org.apache.nifi.admin.service.KeyService;
+import org.apache.nifi.authorization.Authorizer;
+import org.apache.nifi.authorization.RequestAction;
 import org.apache.nifi.authorization.Resource;
+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.cluster.context.ClusterContext;
 import org.apache.nifi.cluster.context.ClusterContextThreadLocal;
 import org.apache.nifi.cluster.coordination.heartbeat.NodeHeartbeat;
@@ -62,13 +67,14 @@ import org.apache.nifi.remote.RootGroupPort;
 import org.apache.nifi.reporting.Bulletin;
 import org.apache.nifi.reporting.BulletinQuery;
 import org.apache.nifi.reporting.BulletinRepository;
-import org.apache.nifi.user.NiFiUser;
 import org.apache.nifi.util.FormatUtils;
 import org.apache.nifi.util.NiFiProperties;
+import org.apache.nifi.web.api.dto.AccessPolicyDTO;
 import org.apache.nifi.web.api.dto.BulletinBoardDTO;
 import org.apache.nifi.web.api.dto.BulletinDTO;
 import org.apache.nifi.web.api.dto.BulletinQueryDTO;
 import org.apache.nifi.web.api.dto.ClusterDTO;
+import org.apache.nifi.web.api.dto.ComponentDTO;
 import org.apache.nifi.web.api.dto.ComponentHistoryDTO;
 import org.apache.nifi.web.api.dto.ComponentStateDTO;
 import org.apache.nifi.web.api.dto.ConnectionDTO;
@@ -82,12 +88,12 @@ import org.apache.nifi.web.api.dto.CountersSnapshotDTO;
 import org.apache.nifi.web.api.dto.DocumentedTypeDTO;
 import org.apache.nifi.web.api.dto.DropRequestDTO;
 import org.apache.nifi.web.api.dto.DtoFactory;
+import org.apache.nifi.web.api.dto.EntityFactory;
 import org.apache.nifi.web.api.dto.FlowFileDTO;
 import org.apache.nifi.web.api.dto.FlowSnippetDTO;
 import org.apache.nifi.web.api.dto.FunnelDTO;
 import org.apache.nifi.web.api.dto.LabelDTO;
 import org.apache.nifi.web.api.dto.ListingRequestDTO;
-import org.apache.nifi.web.api.dto.NiFiComponentDTO;
 import org.apache.nifi.web.api.dto.NodeDTO;
 import org.apache.nifi.web.api.dto.PortDTO;
 import org.apache.nifi.web.api.dto.PreviousValueDTO;
@@ -107,6 +113,8 @@ import org.apache.nifi.web.api.dto.TemplateDTO;
 import org.apache.nifi.web.api.dto.action.ActionDTO;
 import org.apache.nifi.web.api.dto.action.HistoryDTO;
 import org.apache.nifi.web.api.dto.action.HistoryQueryDTO;
+import org.apache.nifi.web.api.dto.flow.FlowDTO;
+import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceOptionsDTO;
@@ -119,6 +127,13 @@ import org.apache.nifi.web.api.dto.status.ProcessGroupStatusDTO;
 import org.apache.nifi.web.api.dto.status.ProcessorStatusDTO;
 import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusDTO;
 import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
+import org.apache.nifi.web.api.entity.ConnectionEntity;
+import org.apache.nifi.web.api.entity.FunnelEntity;
+import org.apache.nifi.web.api.entity.LabelEntity;
+import org.apache.nifi.web.api.entity.PortEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
+import org.apache.nifi.web.api.entity.ProcessorEntity;
+import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity;
 import org.apache.nifi.web.controller.ControllerFacade;
 import org.apache.nifi.web.dao.ConnectionDAO;
 import org.apache.nifi.web.dao.ControllerServiceDAO;
@@ -131,7 +146,6 @@ import org.apache.nifi.web.dao.RemoteProcessGroupDAO;
 import org.apache.nifi.web.dao.ReportingTaskDAO;
 import org.apache.nifi.web.dao.SnippetDAO;
 import org.apache.nifi.web.dao.TemplateDAO;
-import org.apache.nifi.web.security.user.NiFiUserUtils;
 import org.apache.nifi.web.util.SnippetUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -192,6 +206,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     // properties
     private NiFiProperties properties;
     private DtoFactory dtoFactory;
+    private EntityFactory entityFactory;
+
+    private Authorizer authorizer;
 
     // -----------------------------------------
     // Verification Operations
@@ -345,43 +362,73 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     // Write Operations
     // -----------------------------------------
     @Override
-    public ConfigurationSnapshot<ConnectionDTO> updateConnection(final Revision revision, final ConnectionDTO connectionDTO) {
+    public UpdateResult<ConnectionEntity> updateConnection(final Revision revision, final ConnectionDTO connectionDTO) {
         // if connection does not exist, then create new connection
         if (connectionDAO.hasConnection(connectionDTO.getId()) == false) {
-            return createConnection(revision, connectionDTO.getParentGroupId(), connectionDTO);
+            return new UpdateResult<>(createConnection(revision, connectionDTO.getParentGroupId(), connectionDTO), true);
         }
 
-        return updateComponent(revision, () -> connectionDAO.updateConnection(connectionDTO), connection -> dtoFactory.createConnectionDto(connection));
+        final Connection connectionNode = connectionDAO.getConnection(connectionDTO.getId());
+        final ConfigurationSnapshot<ConnectionDTO> snapshot = updateComponent(
+            revision,
+            connectionNode,
+            () -> connectionDAO.updateConnection(connectionDTO),
+            connection -> dtoFactory.createConnectionDto(connection));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connectionNode);
+        return new UpdateResult<>(entityFactory.createConnectionEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
     @Override
-    public ConfigurationSnapshot<ProcessorDTO> updateProcessor(final Revision revision, final ProcessorDTO processorDTO) {
+    public UpdateResult<ProcessorEntity> updateProcessor(final Revision revision, final ProcessorDTO processorDTO) {
         // if processor does not exist, then create new processor
         if (processorDAO.hasProcessor(processorDTO.getId()) == false) {
-            return createProcessor(revision, processorDTO.getParentGroupId(), processorDTO);
+            return new UpdateResult<>(createProcessor(revision, processorDTO.getParentGroupId(), processorDTO), true);
         }
 
-        return updateComponent(revision, () -> processorDAO.updateProcessor(processorDTO), proc -> dtoFactory.createProcessorDto(proc));
+        // get the component, ensure we have access to it, and perform the update request
+        final ProcessorNode processorNode = processorDAO.getProcessor(processorDTO.getId());
+        final ConfigurationSnapshot<ProcessorDTO> snapshot = updateComponent(revision,
+            processorNode,
+            () -> processorDAO.updateProcessor(processorDTO),
+            proc -> dtoFactory.createProcessorDto(proc));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processorNode);
+        return new UpdateResult<>(entityFactory.createProcessorEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
     @Override
-    public ConfigurationSnapshot<LabelDTO> updateLabel(final Revision revision, final LabelDTO labelDTO) {
+    public UpdateResult<LabelEntity> updateLabel(final Revision revision, final LabelDTO labelDTO) {
         // if label does not exist, then create new label
         if (labelDAO.hasLabel(labelDTO.getId()) == false) {
-            return createLabel(revision, labelDTO.getParentGroupId(), labelDTO);
+            return new UpdateResult<>(createLabel(revision, labelDTO.getParentGroupId(), labelDTO), false);
         }
 
-        return updateComponent(revision, () -> labelDAO.updateLabel(labelDTO), label -> dtoFactory.createLabelDto(label));
+        final Label labelNode = labelDAO.getLabel(labelDTO.getId());
+        final ConfigurationSnapshot<LabelDTO> snapshot = updateComponent(revision,
+            labelNode,
+            () -> labelDAO.updateLabel(labelDTO),
+            label -> dtoFactory.createLabelDto(label));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(labelNode);
+        return new UpdateResult<>(entityFactory.createLabelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
     @Override
-    public ConfigurationSnapshot<FunnelDTO> updateFunnel(final Revision revision, final FunnelDTO funnelDTO) {
+    public UpdateResult<FunnelEntity> updateFunnel(final Revision revision, final FunnelDTO funnelDTO) {
         // if label does not exist, then create new label
         if (funnelDAO.hasFunnel(funnelDTO.getId()) == false) {
-            return createFunnel(revision, funnelDTO.getParentGroupId(), funnelDTO);
+            return new UpdateResult<>(createFunnel(revision, funnelDTO.getParentGroupId(), funnelDTO), true);
         }
 
-        return updateComponent(revision, () -> funnelDAO.updateFunnel(funnelDTO), funnel -> dtoFactory.createFunnelDto(funnel));
+        final Funnel funnelNode = funnelDAO.getFunnel(funnelDTO.getId());
+        final ConfigurationSnapshot<FunnelDTO> snapshot = updateComponent(revision,
+            funnelNode,
+            () -> funnelDAO.updateFunnel(funnelDTO),
+            funnel -> dtoFactory.createFunnelDto(funnel));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnelNode);
+        return new UpdateResult<>(entityFactory.createFunnelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
 
@@ -398,10 +445,18 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
      *
      * @return A ConfigurationSnapshot that represents the new configuration
      */
-    private <D, C> ConfigurationSnapshot<D> updateComponent(final Revision revision, final Supplier<C> daoUpdate, final Function<C, D> dtoCreation) {
+    private <D, C> ConfigurationSnapshot<D> updateComponent(final Revision revision, final Authorizable authorizable, final Supplier<C> daoUpdate, final Function<C, D>
+        dtoCreation) {
         return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<D>() {
             @Override
             public ConfigurationResult<D> execute() {
+                // ensure write access to the flow
+                authorizable.authorize(authorizer, RequestAction.WRITE);
+
+                // also ensure read access to the flow as the component must be read in order to generate a response
+                authorizable.authorize(authorizer, RequestAction.READ);
+
+                // get the updated component
                 final C component = daoUpdate.get();
 
                 // save updated controller
@@ -439,52 +494,77 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
             return createSnippet(revision, snippetDto);
         }
 
-        return updateComponent(revision,
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(snippetDto.getParentGroupId());
+        return updateComponent(
+            revision,
+            processGroup,
             () -> snippetDAO.updateSnippet(snippetDto),
             snippet -> {
-                final SnippetDTO responseSnippetDto = dtoFactory.createSnippetDto(snippet);
-                responseSnippetDto.setContents(snippetUtils.populateFlowSnippet(snippet, false, false));
-                return responseSnippetDto;
+                 return dtoFactory.createSnippetDto(snippet);
             });
     }
 
     @Override
-    public ConfigurationSnapshot<PortDTO> updateInputPort(final Revision revision, final PortDTO inputPortDTO) {
+    public UpdateResult<PortEntity> updateInputPort(final Revision revision, final PortDTO inputPortDTO) {
         // if input port does not exist, then create new input port
         if (inputPortDAO.hasPort(inputPortDTO.getId()) == false) {
-            return createInputPort(revision, inputPortDTO.getParentGroupId(), inputPortDTO);
+            return new UpdateResult<>(createInputPort(revision, inputPortDTO.getParentGroupId(), inputPortDTO), true);
         }
 
-        return updateComponent(revision, () -> inputPortDAO.updatePort(inputPortDTO), port -> dtoFactory.createPortDto(port));
+        final Port inputPortNode = inputPortDAO.getPort(inputPortDTO.getId());
+        final ConfigurationSnapshot<PortDTO> snapshot = updateComponent(revision,
+            inputPortNode,
+            () -> inputPortDAO.updatePort(inputPortDTO),
+            port -> dtoFactory.createPortDto(port));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(inputPortNode);
+        return new UpdateResult<>(entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
     @Override
-    public ConfigurationSnapshot<PortDTO> updateOutputPort(final Revision revision, final PortDTO outputPortDTO) {
+    public UpdateResult<PortEntity> updateOutputPort(final Revision revision, final PortDTO outputPortDTO) {
         // if output port does not exist, then create new output port
         if (outputPortDAO.hasPort(outputPortDTO.getId()) == false) {
-            return createOutputPort(revision, outputPortDTO.getParentGroupId(), outputPortDTO);
+            return new UpdateResult<>(createOutputPort(revision, outputPortDTO.getParentGroupId(), outputPortDTO), true);
         }
 
-        return updateComponent(revision, () -> outputPortDAO.updatePort(outputPortDTO), port -> dtoFactory.createPortDto(port));
+        final Port outputPortNode = outputPortDAO.getPort(outputPortDTO.getId());
+        final ConfigurationSnapshot<PortDTO> snapshot = updateComponent(revision,
+            outputPortNode,
+            () -> outputPortDAO.updatePort(outputPortDTO),
+            port -> dtoFactory.createPortDto(port));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(outputPortNode);
+        return new UpdateResult<>(entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false);
     }
 
     @Override
-    public ConfigurationSnapshot<RemoteProcessGroupDTO> updateRemoteProcessGroup(final Revision revision, final RemoteProcessGroupDTO remoteProcessGroupDTO) {
+    public UpdateResult<RemoteProcessGroupEntity> updateRemoteProcessGroup(final Revision revision, final RemoteProcessGroupDTO remoteProcessGroupDTO) {
         // if controller reference does not exist, then create new controller reference
         if (remoteProcessGroupDAO.hasRemoteProcessGroup(remoteProcessGroupDTO.getId()) == false) {
-            return createRemoteProcessGroup(revision, remoteProcessGroupDTO.getParentGroupId(), remoteProcessGroupDTO);
+            return new UpdateResult<>(createRemoteProcessGroup(revision, remoteProcessGroupDTO.getParentGroupId(), remoteProcessGroupDTO), true);
         }
 
-        return updateComponent(revision,
+        final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId());
+        final ConfigurationSnapshot<RemoteProcessGroupDTO> snapshot = updateComponent(
+            revision,
+            remoteProcessGroupNode,
             () -> remoteProcessGroupDAO.updateRemoteProcessGroup(remoteProcessGroupDTO),
             remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroupNode);
+        final RevisionDTO updateRevision = dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId());
+        return new UpdateResult<>(entityFactory.createRemoteProcessGroupEntity(snapshot.getConfiguration(), updateRevision, accessPolicy), false);
     }
 
     @Override
     public ConfigurationSnapshot<RemoteProcessGroupPortDTO> updateRemoteProcessGroupInputPort(
             final Revision revision, final String remoteProcessGroupId, final RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) {
 
-        return updateComponent(revision,
+        final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId());
+        return updateComponent(
+            revision,
+            remoteProcessGroupNode,
             () -> remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(remoteProcessGroupId, remoteProcessGroupPortDTO),
             remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort));
     }
@@ -493,28 +573,42 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     public ConfigurationSnapshot<RemoteProcessGroupPortDTO> updateRemoteProcessGroupOutputPort(
             final Revision revision, final String remoteProcessGroupId, final RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) {
 
-        return updateComponent(revision,
+        final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId());
+        return updateComponent(
+            revision,
+            remoteProcessGroupNode,
             () -> remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(remoteProcessGroupId, remoteProcessGroupPortDTO),
             remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort));
     }
 
     @Override
-    public ConfigurationSnapshot<ProcessGroupDTO> updateProcessGroup(final Revision revision, final ProcessGroupDTO processGroupDTO) {
+    public UpdateResult<ProcessGroupEntity> updateProcessGroup(final Revision revision, final ProcessGroupDTO processGroupDTO) {
         // if process group does not exist, then create new process group
         if (processGroupDAO.hasProcessGroup(processGroupDTO.getId()) == false) {
             if (processGroupDTO.getParentGroupId() == null) {
                 throw new IllegalArgumentException("Unable to create the specified process group since the parent group was not specified.");
             } else {
-                return createProcessGroup(processGroupDTO.getParentGroupId(), revision, processGroupDTO);
+                return new UpdateResult<>(createProcessGroup(processGroupDTO.getParentGroupId(), revision, processGroupDTO), true);
             }
         }
 
-        return updateComponent(revision, () -> processGroupDAO.updateProcessGroup(processGroupDTO), processGroup -> dtoFactory.createProcessGroupDto(processGroup));
+        final ProcessGroup processGroupNode = processGroupDAO.getProcessGroup(processGroupDTO.getId());
+        final ConfigurationSnapshot<ProcessGroupDTO> snapshot = updateComponent(revision,
+            processGroupNode,
+            () -> processGroupDAO.updateProcessGroup(processGroupDTO),
+            processGroup -> dtoFactory.createProcessGroupDto(processGroup));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroupNode);
+        final RevisionDTO updatedRevision = dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId());
+        return new UpdateResult<>(entityFactory.createProcessGroupEntity(snapshot.getConfiguration(), updatedRevision, accessPolicy), false);
     }
 
     @Override
     public ConfigurationSnapshot<ControllerConfigurationDTO> updateControllerConfiguration(final Revision revision, final ControllerConfigurationDTO controllerConfigurationDTO) {
-        return updateComponent(revision,
+
+        return updateComponent(
+            revision,
+            controllerFacade,
             () -> {
                 // update the controller configuration through the proxy
                 if (controllerConfigurationDTO.getName() != null) {
@@ -611,21 +705,33 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteConnection(final Revision revision, final String connectionId) {
-        return deleteComponent(revision, () -> connectionDAO.deleteConnection(connectionId));
+    public ConnectionEntity deleteConnection(final Revision revision, final String connectionId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            connection,
+            () -> connectionDAO.deleteConnection(connectionId));
+
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection);
+        return entityFactory.createConnectionEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
     public DropRequestDTO deleteFlowFileDropRequest(String connectionId, String dropRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
+
         return dtoFactory.createDropRequestDTO(connectionDAO.deleteFlowFileDropRequest(connectionId, dropRequestId));
     }
 
     @Override
     public ListingRequestDTO deleteFlowFileListingRequest(String connectionId, String listingRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
+
         final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.deleteFlowFileListingRequest(connectionId, listingRequestId));
 
         // include whether the source and destination are running
-        final Connection connection = connectionDAO.getConnection(connectionId);
         if (connection.getSource() != null) {
             listRequest.setSourceRunning(connection.getSource().isRunning());
         }
@@ -637,18 +743,36 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteProcessor(final Revision revision, final String processorId) {
-        return deleteComponent(revision, () -> processorDAO.deleteProcessor(processorId));
+    public ProcessorEntity deleteProcessor(final Revision revision, final String processorId) {
+        final ProcessorNode processor = processorDAO.getProcessor(processorId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            processor,
+            () -> processorDAO.deleteProcessor(processorId));
+
+        return entityFactory.createProcessorEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteLabel(final Revision revision, final String labelId) {
-        return deleteComponent(revision, () -> labelDAO.deleteLabel(labelId));
+    public LabelEntity deleteLabel(final Revision revision, final String labelId) {
+        final Label label = labelDAO.getLabel(labelId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            label,
+            () -> labelDAO.deleteLabel(labelId));
+
+        return entityFactory.createLabelEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteFunnel(final Revision revision, final String funnelId) {
-        return deleteComponent(revision, () -> funnelDAO.deleteFunnel(funnelId));
+    public FunnelEntity deleteFunnel(final Revision revision, final String funnelId) {
+        final Funnel funnel = funnelDAO.getFunnel(funnelId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            funnel,
+            () -> funnelDAO.deleteFunnel(funnelId));
+
+        return entityFactory.createFunnelEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     /**
@@ -658,10 +782,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
      * @param action the action that deletes the component via the appropriate DAO object
      * @return a ConfigurationSnapshot that represents the new configuration
      */
-    private ConfigurationSnapshot<Void> deleteComponent(final Revision revision, final Runnable action) {
+    private ConfigurationSnapshot<Void> deleteComponent(final Revision revision, final Authorizable authorizable, final Runnable action) {
         return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<Void>() {
             @Override
             public ConfigurationResult<Void> execute() {
+                // ensure access to the component
+                authorizable.authorize(authorizer, RequestAction.WRITE);
+
                 action.run();
 
                 // save the flow
@@ -688,27 +815,55 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
 
     @Override
     public ConfigurationSnapshot<Void> deleteSnippet(final Revision revision, final String snippetId) {
-        return deleteComponent(revision, () -> snippetDAO.deleteSnippet(snippetId));
+        final Snippet snippet = snippetDAO.getSnippet(snippetId);
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(snippet.getParentGroupId());
+        return deleteComponent(revision,
+            processGroup,
+            () -> snippetDAO.deleteSnippet(snippetId));
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteInputPort(final Revision revision, final String inputPortId) {
-        return deleteComponent(revision, () -> inputPortDAO.deletePort(inputPortId));
+    public PortEntity deleteInputPort(final Revision revision, final String inputPortId) {
+        final Port port = inputPortDAO.getPort(inputPortId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            port,
+            () -> inputPortDAO.deletePort(inputPortId));
+
+        return entityFactory.createPortEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteOutputPort(final Revision revision, final String outputPortId) {
-        return deleteComponent(revision, () -> outputPortDAO.deletePort(outputPortId));
+    public PortEntity deleteOutputPort(final Revision revision, final String outputPortId) {
+        final Port port = outputPortDAO.getPort(outputPortId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            port,
+            () -> outputPortDAO.deletePort(outputPortId));
+
+        return entityFactory.createPortEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteProcessGroup(final Revision revision, final String groupId) {
-        return deleteComponent(revision, () -> processGroupDAO.deleteProcessGroup(groupId));
+    public ProcessGroupEntity deleteProcessGroup(final Revision revision, final String groupId) {
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            processGroup,
+            () -> processGroupDAO.deleteProcessGroup(groupId));
+
+        return entityFactory.createProcessGroupEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
-    public ConfigurationSnapshot<Void> deleteRemoteProcessGroup(final Revision revision, final String remoteProcessGroupId) {
-        return deleteComponent(revision, () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId));
+    public RemoteProcessGroupEntity deleteRemoteProcessGroup(final Revision revision, final String remoteProcessGroupId) {
+        final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId);
+        final ConfigurationSnapshot<Void> snapshot = deleteComponent(
+            revision,
+            remoteProcessGroup,
+            () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId));
+
+        return entityFactory.createRemoteProcessGroupEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null);
     }
 
     @Override
@@ -718,21 +873,34 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<ConnectionDTO> createConnection(final Revision revision, final String groupId, final ConnectionDTO connectionDTO) {
-        return createComponent(revision, connectionDTO, () -> connectionDAO.createConnection(groupId, connectionDTO), connection -> dtoFactory.createConnectionDto(connection));
+    public ConnectionEntity createConnection(final Revision revision, final String groupId, final ConnectionDTO connectionDTO) {
+        final ConfigurationSnapshot<ConnectionDTO> snapshot = createComponent(
+            revision,
+            connectionDTO,
+            () -> connectionDAO.createConnection(groupId, connectionDTO),
+            connection -> dtoFactory.createConnectionDto(connection));
+
+        final Connection connection = connectionDAO.getConnection(connectionDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection);
+        return entityFactory.createConnectionEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
     public DropRequestDTO createFlowFileDropRequest(String connectionId, String dropRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
         return dtoFactory.createDropRequestDTO(connectionDAO.createFlowFileDropRequest(connectionId, dropRequestId));
     }
 
     @Override
     public ListingRequestDTO createFlowFileListingRequest(String connectionId, String listingRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
+
+        // create the listing request
         final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.createFlowFileListingRequest(connectionId, listingRequestId));
 
         // include whether the source and destination are running
-        final Connection connection = connectionDAO.getConnection(connectionId);
         if (connection.getSource() != null) {
             listRequest.setSourceRunning(connection.getSource().isRunning());
         }
@@ -744,13 +912,29 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<ProcessorDTO> createProcessor(final Revision revision, final String groupId, final ProcessorDTO processorDTO) {
-        return createComponent(revision, processorDTO, () -> processorDAO.createProcessor(groupId, processorDTO), processor -> dtoFactory.createProcessorDto(processor));
+    public ProcessorEntity createProcessor(final Revision revision, final String groupId, final ProcessorDTO processorDTO) {
+        final ConfigurationSnapshot<ProcessorDTO> snapshot = createComponent(
+            revision,
+            processorDTO,
+            () -> processorDAO.createProcessor(groupId, processorDTO),
+            processor -> dtoFactory.createProcessorDto(processor));
+
+        final ProcessorNode processor = processorDAO.getProcessor(processorDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processor);
+        return entityFactory.createProcessorEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
-    public ConfigurationSnapshot<LabelDTO> createLabel(final Revision revision, final String groupId, final LabelDTO labelDTO) {
-        return createComponent(revision, labelDTO, () -> labelDAO.createLabel(groupId, labelDTO), label -> dtoFactory.createLabelDto(label));
+    public LabelEntity createLabel(final Revision revision, final String groupId, final LabelDTO labelDTO) {
+        final ConfigurationSnapshot<LabelDTO> snapshot = createComponent(
+            revision,
+            labelDTO,
+            () -> labelDAO.createLabel(groupId, labelDTO),
+            label -> dtoFactory.createLabelDto(label));
+
+        final Label label = labelDAO.getLabel(labelDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(label);
+        return entityFactory.createLabelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     /**
@@ -766,7 +950,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
      *
      * @return a ConfigurationSnapshot that represents the updated configuration
      */
-    private <D, C> ConfigurationSnapshot<D> createComponent(final Revision revision, final NiFiComponentDTO componentDto,
+    private <D, C> ConfigurationSnapshot<D> createComponent(final Revision revision, final ComponentDTO componentDto,
         final Supplier<C> daoCreation, final Function<C, D> dtoCreation) {
 
         return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<D>() {
@@ -777,6 +961,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
                     componentDto.setId(UUID.randomUUID().toString());
                 }
 
+                // ensure access to process group
+                final ProcessGroup parent = processGroupDAO.getProcessGroup(componentDto.getParentGroupId());
+                parent.authorize(authorizer, RequestAction.WRITE);
+
                 // add the component
                 final C component = daoCreation.get();
 
@@ -801,14 +989,22 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
 
 
     @Override
-    public ConfigurationSnapshot<FunnelDTO> createFunnel(final Revision revision, final String groupId, final FunnelDTO funnelDTO) {
-        return createComponent(revision, funnelDTO, () -> funnelDAO.createFunnel(groupId, funnelDTO), funnel -> dtoFactory.createFunnelDto(funnel));
+    public FunnelEntity createFunnel(final Revision revision, final String groupId, final FunnelDTO funnelDTO) {
+        final ConfigurationSnapshot<FunnelDTO> snapshot = createComponent(
+            revision,
+            funnelDTO,
+            () -> funnelDAO.createFunnel(groupId, funnelDTO),
+            funnel -> dtoFactory.createFunnelDto(funnel));
+
+        final Funnel funnel = funnelDAO.getFunnel(funnelDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnel);
+        return entityFactory.createFunnelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
-    private void validateSnippetContents(final FlowSnippetDTO flowSnippet) {
+    private void validateSnippetContents(final FlowSnippetDTO flow) {
         // validate any processors
-        if (flowSnippet.getProcessors() != null) {
-            for (final ProcessorDTO processorDTO : flowSnippet.getProcessors()) {
+        if (flow.getProcessors() != null) {
+            for (final ProcessorDTO processorDTO : flow.getProcessors()) {
                 final ProcessorNode processorNode = processorDAO.getProcessor(processorDTO.getId());
                 final Collection<ValidationResult> validationErrors = processorNode.getValidationErrors();
                 if (validationErrors != null && !validationErrors.isEmpty()) {
@@ -821,8 +1017,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
             }
         }
 
-        if (flowSnippet.getInputPorts() != null) {
-            for (final PortDTO portDTO : flowSnippet.getInputPorts()) {
+        if (flow.getInputPorts() != null) {
+            for (final PortDTO portDTO : flow.getInputPorts()) {
                 final Port port = inputPortDAO.getPort(portDTO.getId());
                 final Collection<ValidationResult> validationErrors = port.getValidationErrors();
                 if (validationErrors != null && !validationErrors.isEmpty()) {
@@ -835,8 +1031,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
             }
         }
 
-        if (flowSnippet.getOutputPorts() != null) {
-            for (final PortDTO portDTO : flowSnippet.getOutputPorts()) {
+        if (flow.getOutputPorts() != null) {
+            for (final PortDTO portDTO : flow.getOutputPorts()) {
                 final Port port = outputPortDAO.getPort(portDTO.getId());
                 final Collection<ValidationResult> validationErrors = port.getValidationErrors();
                 if (validationErrors != null && !validationErrors.isEmpty()) {
@@ -850,8 +1046,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
         }
 
         // get any remote process group issues
-        if (flowSnippet.getRemoteProcessGroups() != null) {
-            for (final RemoteProcessGroupDTO remoteProcessGroupDTO : flowSnippet.getRemoteProcessGroups()) {
+        if (flow.getRemoteProcessGroups() != null) {
+            for (final RemoteProcessGroupDTO remoteProcessGroupDTO : flow.getRemoteProcessGroups()) {
                 final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId());
                 if (remoteProcessGroup.getAuthorizationIssue() != null) {
                     remoteProcessGroupDTO.setAuthorizationIssues(Arrays.asList(remoteProcessGroup.getAuthorizationIssue()));
@@ -861,35 +1057,31 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<FlowSnippetDTO> copySnippet(final Revision revision, final String groupId, final String snippetId, final Double originX, final Double originY) {
-        return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowSnippetDTO>() {
+    public ConfigurationSnapshot<FlowDTO> copySnippet(final Revision revision, final String groupId, final String snippetId, final Double originX, final Double originY) {
+        return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowDTO>() {
             @Override
-            public ConfigurationResult<FlowSnippetDTO> execute() {
+            public ConfigurationResult<FlowDTO> execute() {
                 String id = snippetId;
 
-                // ensure id is set
-                if (StringUtils.isBlank(id)) {
-                    id = UUID.randomUUID().toString();
-                }
-
                 // create the new snippet
-                final FlowSnippetDTO flowSnippet = snippetDAO.copySnippet(groupId, id, originX, originY);
+                final FlowSnippetDTO snippet = snippetDAO.copySnippet(groupId, id, originX, originY);
 
                 // validate the new snippet
-                validateSnippetContents(flowSnippet);
+                validateSnippetContents(snippet);
 
                 // save the flow
                 controllerFacade.save();
 
-                return new ConfigurationResult<FlowSnippetDTO>() {
+                return new ConfigurationResult<FlowDTO>() {
                     @Override
                     public boolean isNew() {
                         return false;
                     }
 
                     @Override
-                    public FlowSnippetDTO getConfiguration() {
-                        return flowSnippet;
+                    public FlowDTO getConfiguration() {
+                        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+                        return dtoFactory.createFlowDto(group, snippet);
                     }
                 };
             }
@@ -909,7 +1101,6 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
                 // add the snippet
                 final Snippet snippet = snippetDAO.createSnippet(snippetDTO);
                 final SnippetDTO responseSnippetDTO = dtoFactory.createSnippetDto(snippet);
-                responseSnippetDTO.setContents(snippetUtils.populateFlowSnippet(snippet, false, false));
 
                 return new ConfigurationResult<SnippetDTO>() {
                     @Override
@@ -927,27 +1118,53 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<PortDTO> createInputPort(final Revision revision, final String groupId, final PortDTO inputPortDTO) {
-        return createComponent(revision, inputPortDTO, () -> inputPortDAO.createPort(groupId, inputPortDTO), port -> dtoFactory.createPortDto(port));
+    public PortEntity createInputPort(final Revision revision, final String groupId, final PortDTO inputPortDTO) {
+        final ConfigurationSnapshot<PortDTO> snapshot = createComponent(
+            revision,
+            inputPortDTO,
+            () -> inputPortDAO.createPort(groupId, inputPortDTO),
+            port -> dtoFactory.createPortDto(port));
+
+        final Port port = inputPortDAO.getPort(inputPortDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port);
+        return entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
-    public ConfigurationSnapshot<PortDTO> createOutputPort(final Revision revision, final String groupId, final PortDTO outputPortDTO) {
-        return createComponent(revision, outputPortDTO, () -> outputPortDAO.createPort(groupId, outputPortDTO), port -> dtoFactory.createPortDto(port));
+    public PortEntity createOutputPort(final Revision revision, final String groupId, final PortDTO outputPortDTO) {
+        final ConfigurationSnapshot<PortDTO> snapshot = createComponent(
+            revision,
+            outputPortDTO,
+            () -> outputPortDAO.createPort(groupId, outputPortDTO),
+            port -> dtoFactory.createPortDto(port));
+
+        final Port port = outputPortDAO.getPort(outputPortDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port);
+        return entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
-    public ConfigurationSnapshot<ProcessGroupDTO> createProcessGroup(final String parentGroupId, final Revision revision, final ProcessGroupDTO processGroupDTO) {
-        return createComponent(revision, processGroupDTO,
+    public ProcessGroupEntity createProcessGroup(final String parentGroupId, final Revision revision, final ProcessGroupDTO processGroupDTO) {
+        final ConfigurationSnapshot<ProcessGroupDTO> snapshot = createComponent(revision, processGroupDTO,
             () -> processGroupDAO.createProcessGroup(parentGroupId, processGroupDTO),
             processGroup -> dtoFactory.createProcessGroupDto(processGroup));
+
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(processGroupDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroup);
+        return entityFactory.createProcessGroupEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
-    public ConfigurationSnapshot<RemoteProcessGroupDTO> createRemoteProcessGroup(final Revision revision, final String groupId, final RemoteProcessGroupDTO remoteProcessGroupDTO) {
-        return createComponent(revision, remoteProcessGroupDTO,
+    public RemoteProcessGroupEntity createRemoteProcessGroup(final Revision revision, final String groupId, final RemoteProcessGroupDTO remoteProcessGroupDTO) {
+        final ConfigurationSnapshot<RemoteProcessGroupDTO> snapshot = createComponent(
+            revision,
+            remoteProcessGroupDTO,
             () -> remoteProcessGroupDAO.createRemoteProcessGroup(groupId, remoteProcessGroupDTO),
             remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup));
+
+        final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId());
+        final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroup);
+        return entityFactory.createRemoteProcessGroupEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy);
     }
 
     @Override
@@ -993,29 +1210,30 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<FlowSnippetDTO> createTemplateInstance(final Revision revision, final String groupId, final Double originX, final Double originY, final String templateId) {
-        return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowSnippetDTO>() {
+    public ConfigurationSnapshot<FlowDTO> createTemplateInstance(final Revision revision, final String groupId, final Double originX, final Double originY, final String templateId) {
+        return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowDTO>() {
             @Override
-            public ConfigurationResult<FlowSnippetDTO> execute() {
+            public ConfigurationResult<FlowDTO> execute() {
                 // instantiate the template - there is no need to make another copy of the flow snippet since the actual template
                 // was copied and this dto is only used to instantiate it's components (which as already completed)
-                final FlowSnippetDTO flowSnippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId);
+                final FlowSnippetDTO snippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId);
 
                 // validate the new snippet
-                validateSnippetContents(flowSnippet);
+                validateSnippetContents(snippet);
 
                 // save the flow
                 controllerFacade.save();
 
-                return new ConfigurationResult<FlowSnippetDTO>() {
+                return new ConfigurationResult<FlowDTO>() {
                     @Override
                     public boolean isNew() {
                         return false;
                     }
 
                     @Override
-                    public FlowSnippetDTO getConfiguration() {
-                        return flowSnippet;
+                    public FlowDTO getConfiguration() {
+                        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+                        return dtoFactory.createFlowDto(group, snippet);
                     }
                 };
             }
@@ -1367,30 +1585,39 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public Set<ConnectionDTO> getConnections(String groupId) {
-        Set<ConnectionDTO> connectionDtos = new LinkedHashSet<>();
+    public Set<ConnectionEntity> getConnections(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        Set<ConnectionEntity> connections = new LinkedHashSet<>();
         for (Connection connection : connectionDAO.getConnections(groupId)) {
-            connectionDtos.add(dtoFactory.createConnectionDto(connection));
+            connections.add(entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connection), null, dtoFactory.createAccessPolicyDto(connection)));
         }
-        return connectionDtos;
+        return connections;
     }
 
     @Override
-    public ConnectionDTO getConnection(String connectionId) {
-        return dtoFactory.createConnectionDto(connectionDAO.getConnection(connectionId));
+    public ConnectionEntity getConnection(String connectionId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connectionDAO.getConnection(connectionId)), null, dtoFactory.createAccessPolicyDto(connection));
     }
 
     @Override
     public DropRequestDTO getFlowFileDropRequest(String connectionId, String dropRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
         return dtoFactory.createDropRequestDTO(connectionDAO.getFlowFileDropRequest(connectionId, dropRequestId));
     }
 
     @Override
     public ListingRequestDTO getFlowFileListingRequest(String connectionId, String listingRequestId) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
+
         final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.getFlowFileListingRequest(connectionId, listingRequestId));
 
         // include whether the source and destination are running
-        final Connection connection = connectionDAO.getConnection(connectionId);
         if (connection.getSource() != null) {
             listRequest.setSourceRunning(connection.getSource().isRunning());
         }
@@ -1403,6 +1630,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
 
     @Override
     public FlowFileDTO getFlowFile(String connectionId, String flowFileUuid) {
+        final Connection connection = connectionDAO.getConnection(connectionId);
+        connection.authorize(authorizer, RequestAction.WRITE);
         return dtoFactory.createFlowFileDTO(connectionDAO.getFlowFile(connectionId, flowFileUuid));
     }
 
@@ -1417,12 +1646,15 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public Set<ProcessorDTO> getProcessors(String groupId) {
-        Set<ProcessorDTO> processorDtos = new LinkedHashSet<>();
+    public Set<ProcessorEntity> getProcessors(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        Set<ProcessorEntity> processors = new LinkedHashSet<>();
         for (ProcessorNode processor : processorDAO.getProcessors(groupId)) {
-            processorDtos.add(dtoFactory.createProcessorDto(processor));
+            processors.add(entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), null, dtoFactory.createAccessPolicyDto(processor)));
         }
-        return processorDtos;
+        return processors;
     }
 
     @Override
@@ -1470,10 +1702,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ProcessorDTO getProcessor(String id) {
+    public ProcessorEntity getProcessor(String id) {
         final ProcessorNode processor = processorDAO.getProcessor(id);
-        final ProcessorDTO processorDto = dtoFactory.createProcessorDto(processor);
-        return processorDto;
+        processor.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), null, dtoFactory.createAccessPolicyDto(processor));
     }
 
     @Override
@@ -1662,80 +1894,103 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public Set<LabelDTO> getLabels(String groupId) {
-        Set<LabelDTO> labelDtos = new LinkedHashSet<>();
+    public Set<LabelEntity> getLabels(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        Set<LabelEntity> labels = new LinkedHashSet<>();
         for (Label label : labelDAO.getLabels(groupId)) {
-            labelDtos.add(dtoFactory.createLabelDto(label));
+            labels.add(entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), null, dtoFactory.createAccessPolicyDto(label)));
         }
-        return labelDtos;
+        return labels;
     }
 
     @Override
-    public LabelDTO getLabel(String labelId) {
-        return dtoFactory.createLabelDto(labelDAO.getLabel(labelId));
+    public LabelEntity getLabel(String labelId) {
+        final Label label = labelDAO.getLabel(labelId);
+        label.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), null, dtoFactory.createAccessPolicyDto(label));
     }
 
     @Override
-    public Set<FunnelDTO> getFunnels(String groupId) {
-        Set<FunnelDTO> funnelDtos = new LinkedHashSet<>();
+    public Set<FunnelEntity> getFunnels(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        final Set<FunnelEntity> funnelDtos = new LinkedHashSet<>();
         for (Funnel funnel : funnelDAO.getFunnels(groupId)) {
-            funnelDtos.add(dtoFactory.createFunnelDto(funnel));
+            funnelDtos.add(entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), null, dtoFactory.createAccessPolicyDto(funnel)));
         }
         return funnelDtos;
     }
 
     @Override
-    public FunnelDTO getFunnel(String funnelId) {
-        return dtoFactory.createFunnelDto(funnelDAO.getFunnel(funnelId));
+    public FunnelEntity getFunnel(String funnelId) {
+        final Funnel funnel = funnelDAO.getFunnel(funnelId);
+        funnel.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), null, dtoFactory.createAccessPolicyDto(funnel));
     }
 
     @Override
     public SnippetDTO getSnippet(String snippetId) {
         final Snippet snippet = snippetDAO.getSnippet(snippetId);
         final SnippetDTO snippetDTO = dtoFactory.createSnippetDto(snippet);
-        snippetDTO.setContents(snippetUtils.populateFlowSnippet(snippet, false, false));
         return snippetDTO;
     }
 
     @Override
-    public Set<PortDTO> getInputPorts(String groupId) {
-        Set<PortDTO> portDtos = new LinkedHashSet<>();
+    public Set<PortEntity> getInputPorts(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        final Set<PortEntity> ports = new LinkedHashSet<>();
         for (Port port : inputPortDAO.getPorts(groupId)) {
-            portDtos.add(dtoFactory.createPortDto(port));
+            ports.add(entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port)));
         }
-        return portDtos;
+        return ports;
     }
 
     @Override
-    public Set<PortDTO> getOutputPorts(String groupId) {
-        Set<PortDTO> portDtos = new LinkedHashSet<>();
+    public Set<PortEntity> getOutputPorts(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        Set<PortEntity> ports = new LinkedHashSet<>();
         for (Port port : outputPortDAO.getPorts(groupId)) {
-            portDtos.add(dtoFactory.createPortDto(port));
+            ports.add(entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port)));
         }
-        return portDtos;
+        return ports;
     }
 
     @Override
-    public Set<ProcessGroupDTO> getProcessGroups(String parentGroupId) {
-        Set<ProcessGroupDTO> processGroupDtos = new LinkedHashSet<>();
-        for (ProcessGroup groups : processGroupDAO.getProcessGroups(parentGroupId)) {
-            processGroupDtos.add(dtoFactory.createProcessGroupDto(groups));
+    public Set<ProcessGroupEntity> getProcessGroups(String parentGroupId) {
+        final ProcessGroup parentGroup = processGroupDAO.getProcessGroup(parentGroupId);
+        parentGroup.authorize(authorizer, RequestAction.READ);
+
+        Set<ProcessGroupEntity> processGroups = new LinkedHashSet<>();
+        for (ProcessGroup group : processGroupDAO.getProcessGroups(parentGroupId)) {
+            processGroups.add(entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group), null, dtoFactory.createAccessPolicyDto(group)));
         }
-        return processGroupDtos;
+        return processGroups;
     }
 
     @Override
-    public Set<RemoteProcessGroupDTO> getRemoteProcessGroups(String groupId) {
-        Set<RemoteProcessGroupDTO> remoteProcessGroupDtos = new LinkedHashSet<>();
-        for (RemoteProcessGroup remoteProcessGroup : remoteProcessGroupDAO.getRemoteProcessGroups(groupId)) {
-            remoteProcessGroupDtos.add(dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup));
+    public Set<RemoteProcessGroupEntity> getRemoteProcessGroups(String groupId) {
+        final ProcessGroup group = processGroupDAO.getProcessGroup(groupId);
+        group.authorize(authorizer, RequestAction.READ);
+
+        Set<RemoteProcessGroupEntity> remoteProcessGroups = new LinkedHashSet<>();
+        for (RemoteProcessGroup rpg : remoteProcessGroupDAO.getRemoteProcessGroups(groupId)) {
+            remoteProcessGroups.add(entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), null, dtoFactory.createAccessPolicyDto(rpg)));
         }
-        return remoteProcessGroupDtos;
+        return remoteProcessGroups;
     }
 
     @Override
-    public PortDTO getInputPort(String inputPortId) {
-        return dtoFactory.createPortDto(inputPortDAO.getPort(inputPortId));
+    public PortEntity getInputPort(String inputPortId) {
+        final Port port = inputPortDAO.getPort(inputPortId);
+        port.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port));
     }
 
     @Override
@@ -1744,8 +1999,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public PortDTO getOutputPort(String outputPortId) {
-        return dtoFactory.createPortDto(outputPortDAO.getPort(outputPortId));
+    public PortEntity getOutputPort(String outputPortId) {
+        final Port port = outputPortDAO.getPort(outputPortId);
+        port.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port));
     }
 
     @Override
@@ -1754,8 +2011,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public RemoteProcessGroupDTO getRemoteProcessGroup(String remoteProcessGroupId) {
-        return dtoFactory.createRemoteProcessGroupDto(remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId));
+    public RemoteProcessGroupEntity getRemoteProcessGroup(String remoteProcessGroupId) {
+        final RemoteProcessGroup rpg = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId);
+        rpg.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), null, dtoFactory.createAccessPolicyDto(rpg));
     }
 
     @Override
@@ -1769,14 +2028,21 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
     }
 
     @Override
-    public ConfigurationSnapshot<ProcessGroupDTO> getProcessGroup(String groupId, final boolean recurse) {
+    public ConfigurationSnapshot<ProcessGroupFlowDTO> getProcessGroupFlow(String groupId, boolean recurse) {
         ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId);
         Revision revision = optimisticLockingManager.getLastModification().getRevision();
-        ConfigurationSnapshot<ProcessGroupDTO> response = new ConfigurationSnapshot<>(revision.getVersion(), dtoFactory.createProcessGroupDto(processGroup, recurse));
+        ConfigurationSnapshot<ProcessGroupFlowDTO> response = new ConfigurationSnapshot<>(revision.getVersion(), dtoFactory.createProcessGroupFlowDto(processGroup, recurse));
         return response;
     }
 
     @Override
+    public ProcessGroupEntity getProcessGroup(String groupId) {
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId);
+        processGroup.authorize(authorizer, RequestAction.READ);
+        return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(processGroup), null, dtoFactory.createAccessPolicyDto(processGroup));
+    }
+
+    @Override
     public Set<ControllerServiceDTO> getControllerServices() {
         final Set<ControllerServiceDTO> controllerServiceDtos = new LinkedHashSet<>();
         for (ControllerServiceNode controllerService : controllerServiceDAO.getControllerServices()) {
@@ -2014,6 +2280,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
         this.dtoFactory = dtoFactory;
     }
 
+    public void setEntityFactory(EntityFactory entityFactory) {
+        this.entityFactory = entityFactory;
+    }
+
     public void setInputPortDAO(PortDAO inputPortDAO) {
         this.inputPortDAO = inputPortDAO;
     }
@@ -2042,6 +2312,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade {
         this.snippetUtils = snippetUtils;
     }
 
+    public void setAuthorizer(Authorizer authorizer) {
+        this.authorizer = authorizer;
+    }
+
     private boolean isPrimaryNode(String nodeId) {
         final Node primaryNode = clusterManager.getPrimaryNode();
         return (primaryNode != null && primaryNode.getNodeId().getId().equals(nodeId));