Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,11 @@ public boolean permit(ReqContext context, String operation, Map<String, Object>
}

if (userCommands.contains(operation)) {
return nimbusUsers.size() == 0 || nimbusUsers.contains(user) || checkUserGroupAllowed(userGroups, nimbusGroups);
// Only an empty nimbus.users AND an empty nimbus.groups means no restriction is configured.
if (nimbusUsers.size() == 0 && nimbusGroups.size() == 0) {
return true;
}
return nimbusUsers.contains(user) || checkUserGroupAllowed(userGroups, nimbusGroups);
}

if (topoCommands.contains(operation)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,57 @@ public void SimpleACLNimbusUserAuthTest() {
assertTrue(authorizer.permit(new ReqContext(supervisorUser), "fileDownload", new HashMap<>()));
}

@Test
@DisabledOnOs(OS.WINDOWS)
public void SimpleACLNimbusGroupAuthTest() {
Subject userA = createSubject("user-a");
Subject userInGroup = createSubject("user-in-readonly-group");
Subject userB = createSubject("user-b");

// neither nimbus.users nor nimbus.groups is set, so there is no restriction
IAuthorizer authorizer = prepareNimbusAuthorizer(null, null);
assertTrue(authorizer.permit(new ReqContext(userA), "submitTopology", new HashMap<>()));
assertTrue(authorizer.permit(new ReqContext(userInGroup), "submitTopology", new HashMap<>()));
assertTrue(authorizer.permit(new ReqContext(userB), "getClusterInfo", new HashMap<>()));

// only nimbus.users is set
authorizer = prepareNimbusAuthorizer(Collections.singletonList("user-a"), null);
assertTrue(authorizer.permit(new ReqContext(userA), "submitTopology", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userInGroup), "submitTopology", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userB), "getClusterInfo", new HashMap<>()));

// only nimbus.groups is set
authorizer = prepareNimbusAuthorizer(null, Collections.singletonList("group-readonly"));
assertTrue(authorizer.permit(new ReqContext(userInGroup), "submitTopology", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userA), "submitTopology", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userB), "fileUpload", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userB), "getClusterInfo", new HashMap<>()));

// both nimbus.users and nimbus.groups are set
authorizer = prepareNimbusAuthorizer(Collections.singletonList("user-a"), Collections.singletonList("group-readonly"));
assertTrue(authorizer.permit(new ReqContext(userA), "submitTopology", new HashMap<>()));
assertTrue(authorizer.permit(new ReqContext(userInGroup), "submitTopology", new HashMap<>()));
assertFalse(authorizer.permit(new ReqContext(userB), "submitTopology", new HashMap<>()));
}

private IAuthorizer prepareNimbusAuthorizer(Collection<String> nimbusUsers, Collection<String> nimbusGroups) {
Map<String, Object> clusterConf = ConfigUtils.readStormConfig();
clusterConf.put(Config.STORM_GROUP_MAPPING_SERVICE_PROVIDER_PLUGIN,
SimpleACLTopologyReadOnlyGroupAuthTestMock.class.getName());

if (nimbusUsers != null) {
clusterConf.put(Config.NIMBUS_USERS, new HashSet<>(nimbusUsers));
}

if (nimbusGroups != null) {
clusterConf.put(Config.NIMBUS_GROUPS, new HashSet<>(nimbusGroups));
}

IAuthorizer authorizer = new SimpleACLAuthorizer();
authorizer.prepare(clusterConf);
return authorizer;
}

@Test
@DisabledOnOs(OS.WINDOWS)
public void SimpleACLTopologyReadOnlyUserAuthTest() {
Expand Down
Loading