This is an automated email from the ASF dual-hosted git repository.

namelchev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new d5af66c5658 IGNITE-18819 Added cluster state change permission (#10558)
d5af66c5658 is described below

commit d5af66c565833ab232db2584f8c9b19793939792
Author: Vladimir Steshin <[email protected]>
AuthorDate: Sun Mar 5 16:38:00 2023 +0300

    IGNITE-18819 Added cluster state change permission (#10558)
---
 .../apache/ignite/jdbc/JdbcAuthorizationTest.java  |   3 +-
 .../cluster/GridClusterStateProcessor.java         |   3 +
 .../processors/rest/GridRestProcessor.java         |  10 +-
 .../ignite/plugin/security/SecurityPermission.java |   8 +
 .../security/client/CommonSecurityCheckTest.java   |   3 +-
 .../cluster/ClusterStatePermissionTest.java        | 339 +++++++++++++++++++++
 .../security/impl/TestSecurityContext.java         |   1 +
 .../snapshot/SnapshotPermissionCheckTest.java      |   4 +-
 .../ignite/testsuites/SecurityTestSuite.java       |   2 +
 .../http/jetty/RestProcessorAuthorizationTest.java |   3 +-
 10 files changed, 367 insertions(+), 9 deletions(-)

diff --git 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcAuthorizationTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcAuthorizationTest.java
index 4dfabf392bd..e986dd74d7e 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcAuthorizationTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/JdbcAuthorizationTest.java
@@ -38,6 +38,7 @@ import static java.sql.DriverManager.getConnection;
 import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.cluster.ClusterState.ACTIVE;
 import static org.apache.ignite.internal.util.IgniteUtils.resolveIgnitePath;
+import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_CLUSTER_STATE;
 import static 
org.apache.ignite.plugin.security.SecurityPermission.CACHE_CREATE;
 import static 
org.apache.ignite.plugin.security.SecurityPermission.CACHE_DESTROY;
 import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_PUT;
@@ -377,7 +378,7 @@ public class JdbcAuthorizationTest extends 
AbstractSecurityTest {
     private SecurityPermissionSet serverPermissions() {
         return create()
             .defaultAllowAll(false)
-            .appendSystemPermissions(CACHE_CREATE, JOIN_AS_SERVER)
+            .appendSystemPermissions(CACHE_CREATE, JOIN_AS_SERVER, 
ADMIN_CLUSTER_STATE)
             .build();
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
index 436be972272..14ac86ef782 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
@@ -94,6 +94,7 @@ import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.plugin.security.SecurityPermission;
 import org.apache.ignite.spi.IgniteNodeValidationResult;
 import org.apache.ignite.spi.discovery.DiscoveryDataBag;
 import org.apache.ignite.spi.systemview.view.BaselineNodeAttributeView;
@@ -1106,6 +1107,8 @@ public class GridClusterStateProcessor extends 
GridProcessorAdapter implements I
         boolean forceChangeBaselineTopology,
         boolean isAutoAdjust
     ) {
+        ctx.security().authorize(SecurityPermission.ADMIN_CLUSTER_STATE);
+
         if (ctx.maintenanceRegistry().isMaintenanceMode()) {
             return new GridFinishedFuture<>(
                 new IgniteCheckedException("Failed to " + prettyStr(state) + " 
(node is in maintenance mode).")
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java
index ab960fd47d1..94c4eae1a4b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java
@@ -916,14 +916,9 @@ public class GridRestProcessor extends 
GridProcessorAdapter implements IgniteRes
 
                 break;
 
-            case CLUSTER_ACTIVE:
-            case CLUSTER_INACTIVE:
-            case CLUSTER_ACTIVATE:
-            case CLUSTER_DEACTIVATE:
             case BASELINE_SET:
             case BASELINE_ADD:
             case BASELINE_REMOVE:
-            case CLUSTER_SET_STATE:
                 perm = SecurityPermission.ADMIN_OPS;
 
                 break;
@@ -943,6 +938,11 @@ public class GridRestProcessor extends 
GridProcessorAdapter implements IgniteRes
             case NAME:
             case LOG:
             case CLUSTER_CURRENT_STATE:
+            case CLUSTER_ACTIVE:
+            case CLUSTER_INACTIVE:
+            case CLUSTER_ACTIVATE:
+            case CLUSTER_DEACTIVATE:
+            case CLUSTER_SET_STATE:
             case CLUSTER_NAME:
             case BASELINE_CURRENT_STATE:
             case CLUSTER_STATE:
diff --git 
a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
 
b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
index cbf896ff314..376dc81ec8a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.plugin.security;
 
+import org.apache.ignite.cluster.ClusterState;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -90,6 +91,13 @@ public enum SecurityPermission {
     /** Administration operation with cluster snapshots (create, cancel, 
check). */
     ADMIN_SNAPSHOT,
 
+    /**
+     * Administration operation: changing cluster state.
+     *
+     * @see ClusterState
+     */
+    ADMIN_CLUSTER_STATE,
+
     /** Permission to execute REFRESH STATISTICS command. */
     REFRESH_STATISTICS,
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/CommonSecurityCheckTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/CommonSecurityCheckTest.java
index bce1075fadb..f6356b832a0 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/CommonSecurityCheckTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/CommonSecurityCheckTest.java
@@ -44,6 +44,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 import static 
org.apache.ignite.internal.processors.security.impl.TestAdditionalSecurityProcessor.CLIENT;
+import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_CLUSTER_STATE;
 import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_OPS;
 import static 
org.apache.ignite.plugin.security.SecurityPermission.CACHE_CREATE;
 import static 
org.apache.ignite.plugin.security.SecurityPermissionSetBuilder.ALL_PERMISSIONS;
@@ -72,7 +73,7 @@ public abstract class CommonSecurityCheckTest extends 
AbstractSecurityTest {
     protected TestSecurityData[] clientData() {
         return new TestSecurityData[]{new TestSecurityData(CLIENT,
             SecurityPermissionSetBuilder.create().defaultAllowAll(false)
-                .appendSystemPermissions(ADMIN_OPS, CACHE_CREATE)
+                .appendSystemPermissions(ADMIN_OPS, CACHE_CREATE, 
ADMIN_CLUSTER_STATE)
                 .build()
         )};
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/cluster/ClusterStatePermissionTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/cluster/ClusterStatePermissionTest.java
new file mode 100644
index 00000000000..a5a9c2eef7e
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/cluster/ClusterStatePermissionTest.java
@@ -0,0 +1,339 @@
+/*
+ * 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.ignite.internal.processors.security.cluster;
+
+import java.security.Permissions;
+import java.util.Collection;
+import java.util.function.Consumer;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCluster;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.client.ClientAuthorizationException;
+import org.apache.ignite.client.ClientCluster;
+import org.apache.ignite.client.Config;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.cluster.ClusterState;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.client.GridClient;
+import org.apache.ignite.internal.client.GridClientConfiguration;
+import org.apache.ignite.internal.client.GridClientException;
+import org.apache.ignite.internal.client.GridClientFactory;
+import org.apache.ignite.internal.processors.rest.GridRestCommand;
+import org.apache.ignite.internal.processors.security.AbstractSecurityTest;
+import org.apache.ignite.internal.processors.security.impl.TestSecurityData;
+import 
org.apache.ignite.internal.processors.security.impl.TestSecurityPluginProvider;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.plugin.security.SecurityCredentials;
+import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider;
+import org.apache.ignite.plugin.security.SecurityException;
+import org.apache.ignite.plugin.security.SecurityPermission;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import static org.apache.ignite.cluster.ClusterState.ACTIVE;
+import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY;
+import static org.apache.ignite.cluster.ClusterState.INACTIVE;
+import static org.apache.ignite.internal.util.lang.GridFunc.asList;
+import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_CLUSTER_STATE;
+import static 
org.apache.ignite.plugin.security.SecurityPermission.JOIN_AS_SERVER;
+import static 
org.apache.ignite.plugin.security.SecurityPermissionSetBuilder.create;
+import static 
org.apache.ignite.testframework.GridTestUtils.assertThrowsAnyCause;
+import static org.apache.ignite.testframework.GridTestUtils.cartesianProduct;
+
+/**
+ * Tests permissions of cluster state change.
+ */
+@RunWith(Parameterized.class)
+public class ClusterStatePermissionTest extends AbstractSecurityTest {
+    /** */
+    private static final SecurityPermission[] EMPTY_PERMS = new 
SecurityPermission[0];
+
+    /** */
+    private SecurityPermission[] permissions = EMPTY_PERMS;
+
+    /** The initiator parameter. */
+    @Parameterized.Parameter
+    public Initiator initiator;
+
+    /** Persistence flag parameter. */
+    @Parameterized.Parameter(1)
+    public boolean persistence;
+
+    /** @return Test parameters. */
+    @Parameterized.Parameters(name = "initiator={0}, persistence={1}")
+    public static Collection<?> parameters() {
+        return cartesianProduct(asList(Initiator.values()), asList(false, 
true));
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String 
instanceName) throws Exception {
+        SecurityPermission[] srvPerms = initiator == Initiator.SERVER || 
initiator == Initiator.CLIENT ? permissions :
+            EMPTY_PERMS;
+
+        // Apply the permissions on client side if they are not for server 
side.
+        SecurityPermission[] clientPerms = F.isEmpty(srvPerms) ? permissions : 
EMPTY_PERMS;
+
+        return getConfiguration(instanceName, srvPerms, clientPerms);
+    }
+
+    /**
+     * @return Ignite configuration with given server and client permissions.
+     */
+    private IgniteConfiguration getConfiguration(
+        String instanceName,
+        SecurityPermission[] srvPerms,
+        SecurityPermission[] cliPerms
+    ) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(instanceName);
+
+        TestSecurityPluginProvider secPlugin = new TestSecurityPluginProvider(
+            instanceName,
+            "",
+            
create().defaultAllowAll(false).appendSystemPermissions(F.concat(srvPerms, 
JOIN_AS_SERVER)).build(),
+            false,
+            new TestSecurityData(
+                "client",
+                "",
+                
create().defaultAllowAll(false).appendSystemPermissions(cliPerms).build(),
+                new Permissions()
+            )
+        );
+
+        cfg.setPluginProviders(secPlugin);
+
+        cfg.setClusterStateOnStart(INACTIVE);
+
+        cfg.setConnectorConfiguration(new ConnectorConfiguration());
+
+        if (!cfg.isClientMode()) {
+            cfg.setDataStorageConfiguration(new DataStorageConfiguration()
+                .setDefaultDataRegionConfiguration(new 
DataRegionConfiguration().setPersistenceEnabled(persistence)));
+        }
+
+        return cfg;
+    }
+
+    /**
+     * Tests that all state changes are allowed with the permission.
+     */
+    @Test
+    public void testActivationDeactivationAllowed() throws Exception {
+        permissions = F.asArray(ADMIN_CLUSTER_STATE);
+
+        doTestChangeState(
+            F.asArray(ACTIVE_READ_ONLY, INACTIVE, ACTIVE_READ_ONLY, ACTIVE, 
INACTIVE, ACTIVE, ACTIVE_READ_ONLY),
+            true
+        );
+    }
+
+    /**
+     * Tests that the activation is not allowed without the permission.
+     */
+    @Test
+    public void testActivationNotAllowed() throws Exception {
+        doTestChangeState(F.asArray(ACTIVE), false);
+    }
+
+    /**
+     * Tests that the deactivation is not allowed without the permission.
+     */
+    @Test
+    public void testDeactivationNotAllowed() throws Exception {
+        startAllAllowedNode();
+
+        doTestChangeState(F.asArray(INACTIVE), false);
+    }
+
+    /**
+     * Tests that same-state change is not allowed without the permission.
+     */
+    @Test
+    public void testSameStateNotAllowedWithoutPermission() throws Exception {
+        startAllAllowedNode();
+
+        doTestChangeState(F.asArray(ACTIVE), false);
+    }
+
+    /**
+     * Starts single server node, activates the cluster.
+     */
+    private void startAllAllowedNode() throws Exception {
+        Ignite ig = startGrid(getConfiguration(getTestIgniteInstanceName(0), 
F.asArray(ADMIN_CLUSTER_STATE),
+            EMPTY_PERMS));
+
+        ig.cluster().state(ACTIVE);
+    }
+
+    /**
+     * Tries to change state and ensures that a proper error raises if 
required.
+     *
+     * @param states Cluster states to try to set to one by one.
+     * @param allowed {@code True}, if the state changes must be allowed. 
{@code False} otherwise.
+     */
+    private void doTestChangeState(ClusterState[] states, boolean allowed) 
throws Exception {
+        assert states != null && states.length > 0;
+
+        Ignite ig = startGrid(G.allGrids().size());
+
+        startGrid(G.allGrids().size());
+
+        Consumer<ClusterState> action = initiatorAction(ig);
+
+        for (int i = 0; i < states.length; ++i) {
+            ClusterState stateTo = states[i];
+
+            if (allowed) {
+                action.accept(stateTo);
+
+                assertEquals(stateTo, ig.cluster().state());
+            }
+            else
+                ensureThrows(action, stateTo);
+        }
+    }
+
+    /**
+     * Ensures that a proper error occurs on cluster change state action.
+     */
+    private void ensureThrows(Consumer<ClusterState> action, ClusterState 
stateTo) {
+        Class<? extends Throwable> cause = SecurityException.class;
+        String errMsg = "Authorization failed [perm=" + ADMIN_CLUSTER_STATE;
+
+        if (Initiator.THIN_CLIENT == initiator) {
+            cause = ClientAuthorizationException.class;
+            errMsg = "User is not authorized to perform this operation";
+        }
+        else if (Initiator.REMOTE_CONTROL == initiator)
+            cause = GridClientException.class;
+
+        assertThrowsAnyCause(
+            null,
+            () -> {
+                action.accept(stateTo);
+
+                return null;
+            },
+            cause,
+            errMsg
+        );
+    }
+
+    /**
+     * @return Change state operation depending on {@link #initiator}.
+     */
+    private Consumer<ClusterState> initiatorAction(Ignite srv) throws 
Exception {
+        switch (initiator) {
+            case SERVER:
+                return (state) -> srv.cluster().state(state);
+
+            case CLIENT:
+                return (state) -> {
+                    try {
+                        
startClientGrid(G.allGrids().size()).cluster().state(state);
+                    }
+                    catch (Exception e) {
+                        throw new IgniteException("Unable to start client 
grid.", e);
+                    }
+                };
+
+            case THIN_CLIENT: {
+                return new Consumer<ClusterState>() {
+                    @Override public void accept(ClusterState state) {
+                        try (IgniteClient client = G.startClient(new 
ClientConfiguration().setAddresses(Config.SERVER)
+                            .setUserName("client").setUserPassword(""))) {
+                            client.cluster().state(state);
+                        }
+                    }
+                };
+            }
+
+            case REMOTE_CONTROL: {
+                GridClientConfiguration cfg = new GridClientConfiguration();
+
+                cfg.setServers(asList("127.0.0.1:11211"));
+
+                cfg.setSecurityCredentialsProvider(
+                    new SecurityCredentialsBasicProvider(new 
SecurityCredentials("client", "")));
+
+                return new Consumer<ClusterState>() {
+                    @Override public void accept(ClusterState state) {
+                        try (GridClient gridClient = 
GridClientFactory.start(cfg)) {
+                            assert gridClient.connected();
+
+                            gridClient.state().state(state, true);
+                        }
+                        catch (GridClientException e) {
+                            throw new IgniteException(e.getMessage(), e);
+                        }
+                    }
+                };
+            }
+
+            default:
+                throw new IllegalArgumentException("Unsupported operation 
initiator: " + initiator);
+        }
+    }
+
+    /**
+     * Initiator type of the cluster state change.
+     */
+    private enum Initiator {
+        /**
+         * Server node for Java API call the or the JMX call.
+         *
+         * @see IgniteCluster#state(ClusterState)
+         */
+        SERVER,
+
+        /**
+         * Client node for Java API call the or the JMX call.
+         *
+         * @see IgniteCluster#state(ClusterState)
+         * @see IgniteConfiguration#isClientMode()
+         */
+        CLIENT,
+
+        /**
+         * Call from the thin client.
+         *
+         * @see ClientCluster#state(ClusterState)
+         */
+        THIN_CLIENT,
+
+        /**
+         * Call from a remote control like control.sh of the REST API.
+         *
+         * @see GridClient
+         * @see GridRestCommand#CLUSTER_SET_STATE
+         */
+        REMOTE_CONTROL
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityContext.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityContext.java
index b17a5972b84..8c6e1af81d4 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityContext.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityContext.java
@@ -69,6 +69,7 @@ public class TestSecurityContext implements SecurityContext, 
Serializable {
             case ADMIN_QUERY:
             case ADMIN_OPS:
             case ADMIN_SNAPSHOT:
+            case ADMIN_CLUSTER_STATE:
             case JOIN_AS_SERVER:
             case ADMIN_KILL:
                 return systemOperationAllowed(perm);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/snapshot/SnapshotPermissionCheckTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/snapshot/SnapshotPermissionCheckTest.java
index 8c1e3feaff2..dec4f8b281f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/snapshot/SnapshotPermissionCheckTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/snapshot/SnapshotPermissionCheckTest.java
@@ -35,6 +35,7 @@ import 
org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.processors.security.AbstractSecurityTest;
 import 
org.apache.ignite.internal.processors.security.AbstractTestSecurityPluginProvider;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.plugin.security.SecurityException;
 import org.apache.ignite.plugin.security.SecurityPermission;
 import org.apache.ignite.plugin.security.SecurityPermissionSet;
@@ -44,6 +45,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 import static java.lang.String.format;
+import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_CLUSTER_STATE;
 import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_SNAPSHOT;
 import static 
org.apache.ignite.plugin.security.SecurityPermission.CACHE_CREATE;
 import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_PUT;
@@ -131,7 +133,7 @@ public class SnapshotPermissionCheckTest extends 
AbstractSecurityTest {
         return SecurityPermissionSetBuilder.create()
             .defaultAllowAll(false)
             .appendCachePermissions(DEFAULT_CACHE_NAME, CACHE_CREATE, 
CACHE_PUT)
-            .appendSystemPermissions(perms)
+            .appendSystemPermissions(F.concat(perms, ADMIN_CLUSTER_STATE))
             .build();
     }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
index d52018d9302..32e62d67ce9 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
@@ -38,6 +38,7 @@ import 
org.apache.ignite.internal.processors.security.client.ThinClientPermissio
 import 
org.apache.ignite.internal.processors.security.client.ThinClientPermissionCheckTest;
 import 
org.apache.ignite.internal.processors.security.client.ThinClientSecurityContextOnRemoteNodeTest;
 import 
org.apache.ignite.internal.processors.security.client.ThinClientSslPermissionCheckTest;
+import 
org.apache.ignite.internal.processors.security.cluster.ClusterStatePermissionTest;
 import 
org.apache.ignite.internal.processors.security.compute.ComputePermissionCheckTest;
 import 
org.apache.ignite.internal.processors.security.compute.closure.ComputeTaskCancelRemoteSecurityContextCheckTest;
 import 
org.apache.ignite.internal.processors.security.compute.closure.ComputeTaskRemoteSecurityContextCheckTest;
@@ -89,6 +90,7 @@ import org.junit.runners.Suite;
     IgniteClientContainSubjectAddressTest.class,
     ClientReconnectTest.class,
     SnapshotPermissionCheckTest.class,
+    ClusterStatePermissionTest.class,
 
     DistributedClosureRemoteSecurityContextCheckTest.class,
     ComputeTaskRemoteSecurityContextCheckTest.class,
diff --git 
a/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestProcessorAuthorizationTest.java
 
b/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestProcessorAuthorizationTest.java
index cd2300b9eef..a7f5ac47b82 100644
--- 
a/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestProcessorAuthorizationTest.java
+++ 
b/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestProcessorAuthorizationTest.java
@@ -81,7 +81,8 @@ public class RestProcessorAuthorizationTest extends 
CommonSecurityCheckTest {
                         SecurityPermission perm,
                         SecurityContext securityCtx
                     ) throws SecurityException {
-                        authorizationCtxList.add(F.t(name, perm, securityCtx));
+                        if (perm.name().startsWith("CACHE_"))
+                            authorizationCtxList.add(F.t(name, perm, 
securityCtx));
 
                         super.authorize(name, perm, securityCtx);
                     }

Reply via email to