Skip to content

Commit 5be7be2

Browse files
authored
Unify access control to AccessControl
1 parent 19de5b1 commit 5be7be2

File tree

27 files changed

+206
-137
lines changed

27 files changed

+206
-137
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,16 @@ public void setUp() throws Exception {
6060
.getConfig()
6161
.getCommonConfig()
6262
.setEnforceStrongPassword(false)
63+
.setPipeMemoryManagementEnabled(false)
64+
.setIsPipeEnableMemoryCheck(false)
6365
.setPipeAutoSplitFullEnabled(false);
6466
// enable subscription
6567
EnvFactory.getEnv()
6668
.getConfig()
6769
.getCommonConfig()
6870
.setSubscriptionEnabled(true)
71+
.setPipeMemoryManagementEnabled(false)
72+
.setIsPipeEnableMemoryCheck(false)
6973
.setPipeAutoSplitFullEnabled(false);
7074
EnvFactory.getEnv().initClusterEnvironment();
7175
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
package org.apache.iotdb.db.auth;
2121

2222
import org.apache.iotdb.common.rpc.thrift.TSStatus;
23+
import org.apache.iotdb.commons.audit.IAuditEntity;
2324
import org.apache.iotdb.commons.audit.UserEntity;
2425
import org.apache.iotdb.commons.auth.AuthException;
2526
import org.apache.iotdb.commons.auth.entity.PrivilegeType;
27+
import org.apache.iotdb.commons.auth.entity.User;
2628
import org.apache.iotdb.commons.conf.CommonDescriptor;
2729
import org.apache.iotdb.commons.conf.IoTDBConstant;
2830
import org.apache.iotdb.commons.path.PartialPath;
@@ -62,6 +64,7 @@
6264
import java.util.Collections;
6365
import java.util.List;
6466
import java.util.Map;
67+
import java.util.Optional;
6568
import java.util.Set;
6669
import java.util.StringJoiner;
6770
import java.util.stream.Collectors;
@@ -127,6 +130,11 @@ public static boolean invalidateCache(String username, String roleName) {
127130
return authorityFetcher.get().getAuthorCache().invalidateCache(username, roleName);
128131
}
129132

133+
public static Optional<Long> getUserId(String username) {
134+
User user = authorityFetcher.get().getUser(username);
135+
return Optional.ofNullable(user == null ? null : user.getUserId());
136+
}
137+
130138
public static TSStatus checkUser(String userName, String password) {
131139
return authorityFetcher.get().checkUser(userName, password);
132140
}
@@ -150,6 +158,17 @@ public static SettableFuture<ConfigTaskResult> operatePermission(
150158
return authorityFetcher.get().operatePermission(authorStatement);
151159
}
152160

161+
public static IAuditEntity createIAuditEntity(String userName, IClientSession clientSession) {
162+
if (clientSession != null && clientSession.getUsername() != null) {
163+
return new UserEntity(
164+
clientSession.getUserId(), clientSession.getUsername(), clientSession.getClientAddress());
165+
} else if (userName != null) {
166+
return new UserEntity(AuthorityChecker.getUserId(userName).orElse(-1L), userName, "");
167+
} else {
168+
return new UserEntity(-1, "unknown", "");
169+
}
170+
}
171+
153172
/** Check whether specific Session has the authorization to given plan. */
154173
public static TSStatus checkAuthority(Statement statement, IClientSession session) {
155174
long startTime = System.nanoTime();

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/deletion/PipeDeleteDataNodeEvent.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
2828
import org.apache.iotdb.commons.pipe.event.EnrichedEvent;
2929
import org.apache.iotdb.commons.pipe.event.SerializableEvent;
30+
import org.apache.iotdb.db.auth.AuthorityChecker;
3031
import org.apache.iotdb.db.pipe.consensus.deletion.DeletionResource;
31-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
3232
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
3333
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.AbstractDeleteDataNode;
3434
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
@@ -160,8 +160,7 @@ public void throwIfNoPrivilege() {
160160
}
161161
for (final TableDeletionEntry entry :
162162
((RelationalDeleteDataNode) deleteDataNode).getModEntries()) {
163-
Coordinator.getInstance()
164-
.getAccessControl()
163+
AuthorityChecker.getAccessControl()
165164
.checkCanSelectFromTable(
166165
userName,
167166
new QualifiedObjectName(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tablet/PipeInsertNodeTabletInsertionEvent.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
2929
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
3030
import org.apache.iotdb.commons.pipe.resource.ref.PipePhantomReferenceManager.PipeEventResource;
31+
import org.apache.iotdb.db.auth.AuthorityChecker;
3132
import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
3233
import org.apache.iotdb.db.pipe.event.ReferenceTrackableEvent;
3334
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
@@ -39,7 +40,6 @@
3940
import org.apache.iotdb.db.pipe.resource.memory.InsertNodeMemoryEstimator;
4041
import org.apache.iotdb.db.pipe.resource.memory.PipeMemoryWeightUtil;
4142
import org.apache.iotdb.db.pipe.resource.memory.PipeTabletMemoryBlock;
42-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
4343
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertNode;
4444
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
4545
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
@@ -290,8 +290,7 @@ public void throwIfNoPrivilege() {
290290
}
291291

292292
private void checkTableName(final String tableName) {
293-
if (!Coordinator.getInstance()
294-
.getAccessControl()
293+
if (!AuthorityChecker.getAccessControl()
295294
.checkCanSelectFromTable4Pipe(
296295
userName,
297296
new QualifiedObjectName(getTableModelDatabaseName(), tableName),

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.apache.iotdb.db.pipe.resource.memory.PipeMemoryManager;
4242
import org.apache.iotdb.db.pipe.resource.tsfile.PipeTsFileResourceManager;
4343
import org.apache.iotdb.db.pipe.source.dataregion.realtime.assigner.PipeTsFileEpochProgressIndexKeeper;
44-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
4544
import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
4645
import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor;
4746
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
@@ -454,8 +453,7 @@ public void throwIfNoPrivilege() {
454453
|| !tablePattern.matchesTable(table)) {
455454
continue;
456455
}
457-
if (!Coordinator.getInstance()
458-
.getAccessControl()
456+
if (!AuthorityChecker.getAccessControl()
459457
.checkCanSelectFromTable4Pipe(
460458
userName,
461459
new QualifiedObjectName(getTableModelDatabaseName(), table),

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
2424
import org.apache.iotdb.commons.pipe.config.PipeConfig;
2525
import org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
26+
import org.apache.iotdb.db.auth.AuthorityChecker;
2627
import org.apache.iotdb.db.conf.IoTDBDescriptor;
2728
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
2829
import org.apache.iotdb.db.pipe.event.common.tablet.PipeRawTabletInsertionEvent;
2930
import org.apache.iotdb.db.pipe.event.common.tsfile.parser.TsFileInsertionEventParser;
3031
import org.apache.iotdb.db.pipe.resource.PipeDataNodeResourceManager;
3132
import org.apache.iotdb.db.pipe.resource.memory.PipeMemoryBlock;
32-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
3333
import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
3434
import org.apache.iotdb.pipe.api.event.dml.insertion.TabletInsertionEvent;
3535
import org.apache.iotdb.pipe.api.exception.PipeException;
@@ -154,8 +154,7 @@ private boolean hasTablePrivilege(final String tableName) {
154154
return Objects.isNull(userName)
155155
|| Objects.isNull(sourceEvent)
156156
|| Objects.isNull(sourceEvent.getTableModelDatabaseName())
157-
|| Coordinator.getInstance()
158-
.getAccessControl()
157+
|| AuthorityChecker.getAccessControl()
159158
.checkCanSelectFromTable4Pipe(
160159
userName,
161160
new QualifiedObjectName(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.iotdb.db.pipe.receiver.protocol.thrift;
2121

2222
import org.apache.iotdb.common.rpc.thrift.TSStatus;
23+
import org.apache.iotdb.commons.audit.IAuditEntity;
2324
import org.apache.iotdb.commons.audit.UserEntity;
2425
import org.apache.iotdb.commons.conf.IoTDBConstant;
2526
import org.apache.iotdb.commons.exception.IllegalPathException;
@@ -660,8 +661,11 @@ private TPipeTransferResp handleTransferSchemaPlan(final PipeTransferPlanNodeReq
660661
// We may be able to skip the alter logical view's exception parsing because
661662
// the "AlterLogicalViewNode" is itself idempotent
662663
if (req.getPlanNode() instanceof AlterLogicalViewNode) {
663-
final TSStatus status =
664-
((AlterLogicalViewNode) req.getPlanNode()).checkPermissionBeforeProcess(username);
664+
AlterLogicalViewNode node = (AlterLogicalViewNode) req.getPlanNode();
665+
IAuditEntity entity = AuthorityChecker.createIAuditEntity(username, null);
666+
TSStatus status =
667+
AuthorityChecker.getAccessControl()
668+
.checkCanAlterView(entity, node.getSourcePaths(), node.getTargetPaths());
665669
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
666670
PipeLogger.log(
667671
LOGGER::warn,
@@ -992,8 +996,7 @@ private void autoCreateDatabaseIfNecessary(final String database) {
992996
return;
993997
}
994998

995-
Coordinator.getInstance()
996-
.getAccessControl()
999+
AuthorityChecker.getAccessControl()
9971000
.checkCanCreateDatabase(username, database, new UserEntity(userId, username, cliHostname));
9981001
final TDatabaseSchema schema = new TDatabaseSchema(new TDatabaseSchema(database));
9991002
schema.setIsTableModel(true);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/writeback/WriteBackSink.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,7 @@ private void autoCreateDatabaseIfNecessary(final String database) {
450450
}
451451

452452
try {
453-
Coordinator.getInstance()
454-
.getAccessControl()
453+
AuthorityChecker.getAccessControl()
455454
.checkCanCreateDatabase(userEntity.getUsername(), database, userEntity);
456455
} catch (final AccessDeniedException e) {
457456
// Auto create failed, we still check if there are existing databases

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/realtime/matcher/CachedSchemaPatternMatcher.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@
2323
import org.apache.iotdb.commons.pipe.config.PipeConfig;
2424
import org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
2525
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
26+
import org.apache.iotdb.db.auth.AuthorityChecker;
2627
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
2728
import org.apache.iotdb.db.pipe.event.common.deletion.PipeDeleteDataNodeEvent;
2829
import org.apache.iotdb.db.pipe.event.common.heartbeat.PipeHeartbeatEvent;
2930
import org.apache.iotdb.db.pipe.event.common.tsfile.PipeTsFileInsertionEvent;
3031
import org.apache.iotdb.db.pipe.event.realtime.PipeRealtimeEvent;
3132
import org.apache.iotdb.db.pipe.source.dataregion.realtime.PipeRealtimeDataRegionSource;
32-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
3333
import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
34-
import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
3534

3635
import com.github.benmanes.caffeine.cache.Cache;
3736
import com.github.benmanes.caffeine.cache.Caffeine;
@@ -59,7 +58,6 @@ public class CachedSchemaPatternMatcher implements PipeDataRegionMatcher {
5958
protected static final String TREE_MODEL_EVENT_TABLE_NAME_PREFIX = PATH_ROOT + PATH_SEPARATOR;
6059

6160
protected final ReentrantReadWriteLock lock;
62-
private final AccessControl accessControl = Coordinator.getInstance().getAccessControl();
6361
protected final Set<PipeRealtimeDataRegionSource> sources;
6462

6563
protected final Cache<IDeviceID, Set<PipeRealtimeDataRegionSource>> deviceToSourcesCache;
@@ -332,11 +330,13 @@ private boolean matchesTablePattern(
332330

333331
private boolean notFilteredByAccess(
334332
final UserEntity userEntity, final Pair<String, IDeviceID> databaseNameAndTableName) {
335-
return accessControl.checkCanSelectFromTable4Pipe(
336-
userEntity.getUsername(),
337-
new QualifiedObjectName(
338-
databaseNameAndTableName.getLeft(), databaseNameAndTableName.getRight().getTableName()),
339-
userEntity);
333+
return AuthorityChecker.getAccessControl()
334+
.checkCanSelectFromTable4Pipe(
335+
userEntity.getUsername(),
336+
new QualifiedObjectName(
337+
databaseNameAndTableName.getLeft(),
338+
databaseNameAndTableName.getRight().getTableName()),
339+
userEntity);
340340
}
341341

342342
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/schemaregion/IoTDBSchemaRegionSource.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131
import org.apache.iotdb.commons.utils.PathUtils;
3232
import org.apache.iotdb.consensus.ConsensusFactory;
3333
import org.apache.iotdb.consensus.exception.ConsensusException;
34+
import org.apache.iotdb.db.auth.AuthorityChecker;
3435
import org.apache.iotdb.db.conf.IoTDBDescriptor;
3536
import org.apache.iotdb.db.consensus.SchemaRegionConsensusImpl;
3637
import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
3738
import org.apache.iotdb.db.pipe.event.common.schema.PipeSchemaRegionSnapshotEvent;
3839
import org.apache.iotdb.db.pipe.event.common.schema.PipeSchemaRegionWritePlanEvent;
3940
import org.apache.iotdb.db.pipe.metric.overview.PipeDataNodeSinglePipeMetrics;
4041
import org.apache.iotdb.db.pipe.metric.schema.PipeSchemaRegionSourceMetrics;
41-
import org.apache.iotdb.db.queryengine.plan.Coordinator;
4242
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
4343
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
4444
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
@@ -157,8 +157,7 @@ protected long getMaxBlockingTimeMs() {
157157
protected boolean canSkipSnapshotPrivilegeCheck(final PipeSnapshotEvent event) {
158158
try {
159159
if (PathUtils.isTableModelDatabase(database)) {
160-
Coordinator.getInstance()
161-
.getAccessControl()
160+
AuthorityChecker.getAccessControl()
162161
.checkCanSelectFromDatabase4Pipe(userName, database, userEntity);
163162
}
164163
return true;

0 commit comments

Comments
 (0)