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

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 1cebc04393638587e22631016ceb3cbf9bf6adba
Author: Jiale He <35652389+jial...@users.noreply.github.com>
AuthorDate: Thu Jan 5 18:49:21 2023 +0800

    KYLIN-5457 fix ldap authorize user group project permissions
    
    * KYLIN-5457 fix ldap authorize user group project permissions
    * KYLIN-5457 fix OpenUserGroupService
---
 .../kylin/rest/service/LdapUserGroupService.java   | 13 ++++
 .../kylin/rest/service/OpenUserGroupService.java   | 15 +++-
 .../kylin/rest/service/LdapUserServiceTest.java    | 79 ++++++++++++----------
 .../kylin/rest/service/OpenUserServiceTest.java    | 25 ++++++-
 4 files changed, 92 insertions(+), 40 deletions(-)

diff --git 
a/src/common-service/src/main/java/org/apache/kylin/rest/service/LdapUserGroupService.java
 
b/src/common-service/src/main/java/org/apache/kylin/rest/service/LdapUserGroupService.java
index de41aff9de..47a1dd17c4 100644
--- 
a/src/common-service/src/main/java/org/apache/kylin/rest/service/LdapUserGroupService.java
+++ 
b/src/common-service/src/main/java/org/apache/kylin/rest/service/LdapUserGroupService.java
@@ -233,4 +233,17 @@ public class LdapUserGroupService extends 
NUserGroupService {
     public String getUuidByGroupName(String groupName) {
         return groupName;
     }
+
+    @Override
+    public boolean exists(String name) {
+        return getAllUserGroups().contains(name);
+    }
+
+    @Override
+    public Set<String> listUserGroups(String username) {
+        return getAllUserGroups().stream()
+                .filter(group -> getGroupMembersByName(group).stream()
+                        .anyMatch(user -> 
StringUtils.equalsIgnoreCase(username, user.getUsername())))
+                .collect(Collectors.toSet());
+    }
 }
diff --git 
a/src/common-service/src/main/java/org/apache/kylin/rest/service/OpenUserGroupService.java
 
b/src/common-service/src/main/java/org/apache/kylin/rest/service/OpenUserGroupService.java
index cb751efde3..d26e91e85d 100644
--- 
a/src/common-service/src/main/java/org/apache/kylin/rest/service/OpenUserGroupService.java
+++ 
b/src/common-service/src/main/java/org/apache/kylin/rest/service/OpenUserGroupService.java
@@ -20,11 +20,12 @@ package org.apache.kylin.rest.service;
 
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.kylin.common.msg.MsgPicker;
 import org.apache.kylin.common.annotation.ThirdPartyDependencies;
+import org.apache.kylin.common.msg.MsgPicker;
 import org.apache.kylin.metadata.user.ManagedUser;
 import org.apache.kylin.metadata.usergroup.UserGroup;
 
@@ -80,4 +81,16 @@ public abstract class OpenUserGroupService extends 
NUserGroupService {
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public boolean exists(String name) {
+        return getAllUserGroups().contains(name);
+    }
+
+    @Override
+    public Set<String> listUserGroups(String username) {
+        return getAllUserGroups().stream()
+                .filter(group -> getGroupMembersByName(group).stream()
+                        .anyMatch(user -> 
StringUtils.equalsIgnoreCase(username, user.getUsername())))
+                .collect(Collectors.toSet());
+    }
 }
diff --git 
a/src/common-service/src/test/java/org/apache/kylin/rest/service/LdapUserServiceTest.java
 
b/src/common-service/src/test/java/org/apache/kylin/rest/service/LdapUserServiceTest.java
index 1b07ad2985..b43d62b638 100644
--- 
a/src/common-service/src/test/java/org/apache/kylin/rest/service/LdapUserServiceTest.java
+++ 
b/src/common-service/src/test/java/org/apache/kylin/rest/service/LdapUserServiceTest.java
@@ -25,8 +25,8 @@ import static 
org.springframework.security.test.web.servlet.response.SecurityMoc
 import static 
org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated;
 import static 
org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
 
-import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -53,9 +53,7 @@ import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
@@ -79,7 +77,6 @@ import org.springframework.web.context.WebApplicationContext;
 
 import com.google.common.cache.Cache;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
 import com.unboundid.ldap.listener.InMemoryDirectoryServer;
 import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
 import com.unboundid.ldap.listener.InMemoryListenerConfig;
@@ -119,14 +116,11 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     @Qualifier("userGroupService")
     LdapUserGroupService userGroupService;
 
-    @Rule
-    public ExpectedException thrown = ExpectedException.none();
-
     @BeforeClass
     public static void setupResource() throws Exception {
         staticCreateTestMetadata();
         Properties ldapConfig = new Properties();
-        ldapConfig.load(new FileInputStream(new 
ClassPathResource(LDAP_CONFIG).getFile()));
+        ldapConfig.load(Files.newInputStream(new 
ClassPathResource(LDAP_CONFIG).getFile().toPath()));
         final KylinConfig kylinConfig = getTestConfig();
         overwriteSystemPropBeforeClass("kylin.security.ldap.max-page-size", 
"1");
         ldapConfig.forEach((k, v) -> kylinConfig.setProperty(k.toString(), 
v.toString()));
@@ -146,7 +140,7 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     }
 
     @AfterClass
-    public static void cleanupResource() throws Exception {
+    public static void cleanupResource() {
         directoryServer.shutDown(true);
         staticCleanupTestMetadata();
     }
@@ -181,26 +175,22 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
 
     @Test
     public void testCreateUser() {
-        thrown.expect(UnsupportedOperationException.class);
-        ldapUserService.createUser(null);
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
ldapUserService.createUser(null));
     }
 
     @Test
     public void testUpdateUser() {
-        thrown.expect(UnsupportedOperationException.class);
-        ldapUserService.updateUser(null);
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
ldapUserService.updateUser(null));
     }
 
     @Test
     public void testDeleteUser() {
-        thrown.expect(UnsupportedOperationException.class);
-        ldapUserService.deleteUser("ben");
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
ldapUserService.deleteUser("ben"));
     }
 
     @Test
     public void testChangePassword() {
-        thrown.expect(UnsupportedOperationException.class);
-        ldapUserService.changePassword("old", "new");
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
ldapUserService.changePassword("old", "new"));
     }
 
     @Test
@@ -216,8 +206,8 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testListUsers() throws Exception {
-        Set<String> users = ldapUserService.listUsers().stream().map(x -> 
x.getUsername()).collect(toSet());
+    public void testListUsers() {
+        Set<String> users = 
ldapUserService.listUsers().stream().map(ManagedUser::getUsername).collect(toSet());
         Assert.assertEquals(6, users.size());
         List<ManagedUser> managedUserList = ldapUserService.listUsers();
         for (val user : managedUserList) {
@@ -231,7 +221,7 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testListSuperAdminUsers() throws Exception {
+    public void testListSuperAdminUsers() {
         getTestConfig().setProperty("kylin.security.acl.super-admin-username", 
"jenny");
         Assert.assertEquals("jenny", 
ldapUserService.listSuperAdminUsers().get(0));
     }
@@ -239,14 +229,15 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     @Test
     public void testLoadUserByUsername() {
         
Assert.assertTrue(ldapUserService.loadUserByUsername("jenny").getAuthorities().stream()
-                .map(x -> 
x.getAuthority()).collect(toSet()).contains("ROLE_ADMIN"));
+                
.map(GrantedAuthority::getAuthority).collect(toSet()).contains("ROLE_ADMIN"));
     }
 
     @Test
     public void testCompleteUserInfoInternal() {
         ManagedUser user = new ManagedUser("oliver", "", false);
         ldapUserService.completeUserInfoInternal(user);
-        Set<String> authorities = user.getAuthorities().stream().map(x -> 
x.getAuthority()).collect(toSet());
+        Set<String> authorities = 
user.getAuthorities().stream().map(SimpleGrantedAuthority::getAuthority)
+                .collect(toSet());
         Assert.assertFalse(authorities.contains("ROLE_ADMIN"));
         Assert.assertTrue(authorities.contains("itpeople"));
     }
@@ -261,34 +252,33 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testOnNewUserAdded() throws Exception {
+    public void testOnNewUserAdded() {
         Assert.assertTrue(ldapUserService.userExists("rick"));
         ldapUserService.onUserAuthenticated("rick");
         Assert.assertTrue(ldapUserService.userExists("rick"));
     }
 
     @Test
-    public void testOnUserWithoutPassword() throws Exception {
+    public void testOnUserWithoutPassword() {
         ldapUserService.onUserAuthenticated("ricky");
         Assert.assertTrue(ldapUserService.userExists("ricky"));
     }
 
     @Test
     public void testAddGroup() {
-        thrown.expect(UnsupportedOperationException.class);
-        userGroupService.addGroup("gg");
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
userGroupService.addGroup("gg"));
     }
 
     @Test
     public void testUpdateUserGroup() {
-        thrown.expect(UnsupportedOperationException.class);
-        userGroupService.modifyGroupUsers("gg", Lists.newArrayList());
+        List<String> emptyUserGroup = Collections.emptyList();
+        Assert.assertThrows(UnsupportedOperationException.class,
+                () -> userGroupService.modifyGroupUsers("gg", emptyUserGroup));
     }
 
     @Test
     public void testDeleteUserGroup() {
-        thrown.expect(UnsupportedOperationException.class);
-        userGroupService.deleteGroup("gg");
+        Assert.assertThrows(UnsupportedOperationException.class, () -> 
userGroupService.deleteGroup("gg"));
     }
 
     @Test
@@ -360,7 +350,7 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     public void testGroupNameByUuidAndUuidByGroupName() throws IOException {
         List<UserGroupResponseKI> userGroupResponse = 
userGroupService.getUserGroupResponse(
                 
userGroupService.getAllUserGroups().stream().map(UserGroup::new).collect(Collectors.toList()));
-        userGroupResponse.stream().forEach(response -> {
+        userGroupResponse.forEach(response -> {
             String groupName = response.getGroupName();
             String uuidByGroupName = 
userGroupService.getUuidByGroupName(response.getGroupName());
             Assert.assertEquals(groupName, uuidByGroupName);
@@ -372,7 +362,7 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     }
 
     @Test
-    public void testGetDnMapperMap() throws Exception {
+    public void testGetDnMapperMap() {
         String cacheKey = ReflectionTestUtils.getField(LdapUserService.class, 
"LDAP_VALID_DN_MAP_KEY").toString();
         Cache cache = (Cache) 
ReflectionTestUtils.getField(LdapUserService.class, "LDAP_VALID_DN_MAP_CACHE");
         cache.invalidate(cacheKey);
@@ -384,8 +374,8 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
     public void testSameNameUserInvalidation() {
         Assert.assertFalse(
                 
ldapUserService.listUsers().stream().map(ManagedUser::getUsername).collect(toSet()).contains("user"));
-        
Assert.assertFalse(userGroupService.getUserAndUserGroup().entrySet().stream().map(Map.Entry::getValue)
-                .map(HashSet::new).map(set -> 
set.contains("user")).reduce(Boolean::logicalOr).get().booleanValue());
+        
Assert.assertFalse(userGroupService.getUserAndUserGroup().values().stream().map(HashSet::new)
+                .map(set -> 
set.contains("user")).reduce(Boolean::logicalOr).get());
     }
 
     @Test
@@ -429,12 +419,29 @@ public class LdapUserServiceTest extends 
NLocalFileMetadataTestCase {
         
getTestConfig().setProperty("kylin.security.acl.data-permission-default-enabled",
 "false");
         userAclService.syncAdminUserAcl(Collections.emptyList(), false);
         Assert.assertNull(userAclManager.get("jenny"));
-        userAclService.syncAdminUserAcl(Arrays.asList("jenny"), true);
+        userAclService.syncAdminUserAcl(Collections.singletonList("jenny"), 
true);
         
Assert.assertTrue(userAclManager.get("jenny").hasPermission(AclPermission.DATA_QUERY));
 
         getTestConfig().setProperty("kylin.security.acl.super-admin-username", 
"");
         userAclManager.delete("jenny");
-        userAclService.syncAdminUserAcl(Arrays.asList("jenny"), true);
+        userAclService.syncAdminUserAcl(Collections.singletonList("jenny"), 
true);
         
Assert.assertFalse(userAclManager.get("jenny").hasPermission(AclPermission.DATA_QUERY));
     }
+
+    @Test
+    public void testUserGroupExists() {
+        Assert.assertTrue(userGroupService.exists("admin"));
+        Assert.assertFalse(userGroupService.exists("not_exist_group"));
+    }
+
+    @Test
+    public void testListUserGroupsByUsername() {
+        Assert.assertTrue(ldapUserService.userExists("johnny"));
+        Set<String> johnnyGroups = userGroupService.listUserGroups("johnny");
+        Assert.assertFalse(johnnyGroups.isEmpty());
+
+        Assert.assertFalse(ldapUserService.userExists("not_exist_user"));
+        Set<String> notExistUser = 
userGroupService.listUserGroups("not_exist_user");
+        Assert.assertTrue(notExistUser.isEmpty());
+    }
 }
diff --git 
a/src/common-service/src/test/java/org/apache/kylin/rest/service/OpenUserServiceTest.java
 
b/src/common-service/src/test/java/org/apache/kylin/rest/service/OpenUserServiceTest.java
index 85852ff3ab..c8ad9e6b68 100644
--- 
a/src/common-service/src/test/java/org/apache/kylin/rest/service/OpenUserServiceTest.java
+++ 
b/src/common-service/src/test/java/org/apache/kylin/rest/service/OpenUserServiceTest.java
@@ -18,12 +18,13 @@
 
 package org.apache.kylin.rest.service;
 
-import java.io.FileInputStream;
+import java.nio.file.Files;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.scheduler.EventBusFactory;
@@ -96,7 +97,8 @@ public class OpenUserServiceTest extends 
NLocalFileMetadataTestCase {
     public static void setupResource() throws Exception {
         staticCreateTestMetadata();
         Properties ldapConfig = new Properties();
-        ldapConfig.load(new FileInputStream(new 
ClassPathResource("ut_custom/custom-config.properties").getFile()));
+        ldapConfig.load(
+                Files.newInputStream(new 
ClassPathResource("ut_custom/custom-config.properties").getFile().toPath()));
         final KylinConfig kylinConfig = getTestConfig();
         ldapConfig.forEach((k, v) -> kylinConfig.setProperty(k.toString(), 
v.toString()));
 
@@ -247,7 +249,7 @@ public class OpenUserServiceTest extends 
NLocalFileMetadataTestCase {
 
     @Test
     public void testDoAfterListAdminUsers() {
-        List adminUserList = Arrays.asList("admin", "sunny");
+        List<String> adminUserList = Arrays.asList("admin", "sunny");
         val adminUserAspect = SpringContext.getBean(AdminUserAspect.class);
         adminUserAspect.doAfterListAdminUsers(adminUserList);
         Assert.assertTrue(((List) 
ReflectionTestUtils.getField(adminUserAspect, 
"adminUserList")).contains("sunny"));
@@ -276,4 +278,21 @@ public class OpenUserServiceTest extends 
NLocalFileMetadataTestCase {
         userAclService.syncAdminUserAcl();
         Assert.assertTrue(userAclService.hasUserAclPermission("admin", 
AclPermission.DATA_QUERY));
     }
+
+    @Test
+    public void testUserGroupExists() {
+        Assert.assertTrue(userGroupService.exists("ROLE_ADMIN"));
+        Assert.assertFalse(userGroupService.exists("not_exist_group"));
+    }
+
+    @Test
+    public void testListUserGroupsByUsername() {
+        Assert.assertTrue(userService.userExists("test"));
+        Set<String> testGroups = userGroupService.listUserGroups("test");
+        Assert.assertFalse(testGroups.isEmpty());
+
+        Assert.assertFalse(userService.userExists("not_exist_user"));
+        Set<String> notExistUser = 
userGroupService.listUserGroups("not_exist_user");
+        Assert.assertTrue(notExistUser.isEmpty());
+    }
 }

Reply via email to