You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/06/22 13:11:16 UTC

kylin git commit: minor, complete UserService

Repository: kylin
Updated Branches:
  refs/heads/master 91d6798d4 -> def979d9c


minor, complete UserService


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/def979d9
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/def979d9
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/def979d9

Branch: refs/heads/master
Commit: def979d9ce0507840e4bb35f5de935e303b58688
Parents: 91d6798
Author: Yang Li <li...@apache.org>
Authored: Wed Jun 22 21:10:52 2016 +0800
Committer: Yang Li <li...@apache.org>
Committed: Wed Jun 22 21:10:52 2016 +0800

----------------------------------------------------------------------
 .../apache/kylin/rest/service/UserService.java  | 80 ++++++++++++++------
 .../kylin/rest/service/UserServiceTest.java     |  9 ++-
 2 files changed, 61 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/def979d9/server/src/main/java/org/apache/kylin/rest/service/UserService.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/service/UserService.java b/server/src/main/java/org/apache/kylin/rest/service/UserService.java
index e4e2de3..2e27ca4 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/UserService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/UserService.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.PostConstruct;
@@ -35,7 +36,7 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.kylin.common.util.Bytes;
-import org.apache.kylin.common.util.JsonUtil;
+import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.rest.security.AclHBaseStorage;
 import org.apache.kylin.rest.security.UserManager;
 import org.apache.kylin.rest.util.Serializer;
@@ -46,7 +47,9 @@ import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Component;
 
+import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
 
 /**
  * @author xduo
@@ -77,15 +80,11 @@ public class UserService implements UserManager {
             get.addFamily(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY));
             Result result = htable.get(get);
 
-            Collection<? extends GrantedAuthority> authorities = null;
-            if (null != result && !result.isEmpty()) {
-                byte[] gaBytes = result.getValue(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN));
-                authorities = Arrays.asList(ugaSerializer.deserialize(gaBytes));
-            } else {
+            User user = hbaseRowToUser(result);
+            if (user == null)
                 throw new UsernameNotFoundException("User " + username + " not found.");
-            }
 
-            return new User(username, "N/A", authorities);
+            return user;
         } catch (IOException e) {
             throw new RuntimeException(e.getMessage(), e);
         } finally {
@@ -93,6 +92,41 @@ public class UserService implements UserManager {
         }
     }
 
+    private User hbaseRowToUser(Result result) throws JsonParseException, JsonMappingException, IOException {
+        if (null == result || result.isEmpty())
+            return null;
+
+        String username = Bytes.toString(result.getRow());
+        
+        byte[] valueBytes = result.getValue(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN));
+        UserGrantedAuthority[] deserialized = ugaSerializer.deserialize(valueBytes);
+        
+        // password is stored as the [0] authority
+        String password = deserialized[0].getAuthority();
+        List<UserGrantedAuthority> authorities = Arrays.asList(deserialized).subList(1, deserialized.length);
+        
+        return new User(username, password, authorities);
+    }
+
+    private Pair<byte[], byte[]> userToHBaseRow(UserDetails user) throws JsonProcessingException {
+        byte[] key = Bytes.toBytes(user.getUsername());
+        
+        Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
+        if (authorities == null)
+            authorities = Collections.emptyList();
+        
+        UserGrantedAuthority[] serializing = new UserGrantedAuthority[authorities.size() + 1];
+        // password is stored as the [0] authority
+        serializing[0] = new UserGrantedAuthority(user.getPassword());
+        int i = 1;
+        for (GrantedAuthority a : authorities) {
+            serializing[i++] = new UserGrantedAuthority(a.getAuthority());
+        }
+        
+        byte[] value = ugaSerializer.serialize(serializing);
+        return Pair.newPair(key, value);
+    }
+    
     @Override
     public void createUser(UserDetails user) {
         updateUser(user);
@@ -102,11 +136,11 @@ public class UserService implements UserManager {
     public void updateUser(UserDetails user) {
         HTableInterface htable = null;
         try {
-            byte[] userAuthorities = serialize(user.getAuthorities());
             htable = aclHBaseStorage.getTable(userTableName);
 
-            Put put = new Put(Bytes.toBytes(user.getUsername()));
-            put.add(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN), userAuthorities);
+            Pair<byte[], byte[]> pair = userToHBaseRow(user);
+            Put put = new Put(pair.getKey());
+            put.add(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN), pair.getSecond());
 
             htable.put(put);
             htable.flushCommits();
@@ -160,7 +194,7 @@ public class UserService implements UserManager {
         Scan s = new Scan();
         s.addColumn(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN));
 
-        List<String> authorities = new ArrayList<String>();
+        List<String> all = new ArrayList<String>();
         HTableInterface htable = null;
         ResultScanner scanner = null;
         try {
@@ -168,12 +202,11 @@ public class UserService implements UserManager {
             scanner = htable.getScanner(s);
 
             for (Result result = scanner.next(); result != null; result = scanner.next()) {
-                byte[] uaBytes = result.getValue(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN));
-                Collection<? extends GrantedAuthority> authCollection = Arrays.asList(ugaSerializer.deserialize(uaBytes));
+                User user = hbaseRowToUser(result);
 
-                for (GrantedAuthority auth : authCollection) {
-                    if (!authorities.contains(auth.getAuthority())) {
-                        authorities.add(auth.getAuthority());
+                for (GrantedAuthority auth : user.getAuthorities()) {
+                    if (!all.contains(auth.getAuthority())) {
+                        all.add(auth.getAuthority());
                     }
                 }
             }
@@ -184,7 +217,7 @@ public class UserService implements UserManager {
             IOUtils.closeQuietly(htable);
         }
 
-        return authorities;
+        return all;
     }
 
     public static class UserGrantedAuthority implements GrantedAuthority {
@@ -194,6 +227,10 @@ public class UserService implements UserManager {
         public UserGrantedAuthority() {
         }
 
+        public UserGrantedAuthority(String authority) {
+            setAuthority(authority);
+        }
+        
         @Override
         public String getAuthority() {
             return authority;
@@ -229,11 +266,4 @@ public class UserService implements UserManager {
         }
     }
 
-    private byte[] serialize(Collection<? extends GrantedAuthority> auths) throws JsonProcessingException {
-        if (null == auths) {
-            return null;
-        }
-
-        return JsonUtil.writeValueAsBytes(auths);
-    }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/def979d9/server/src/test/java/org/apache/kylin/rest/service/UserServiceTest.java
----------------------------------------------------------------------
diff --git a/server/src/test/java/org/apache/kylin/rest/service/UserServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/UserServiceTest.java
index e47447a..1bf3ce8 100644
--- a/server/src/test/java/org/apache/kylin/rest/service/UserServiceTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/service/UserServiceTest.java
@@ -44,14 +44,17 @@ public class UserServiceTest extends ServiceTestBase {
 
         List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
         authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-        User user = new User("ADMIN", "ADMIN", authorities);
+        User user = new User("ADMIN", "PWD", authorities);
         userService.createUser(user);
 
         Assert.assertTrue(userService.userExists("ADMIN"));
 
         UserDetails ud = userService.loadUserByUsername("ADMIN");
-        Assert.assertTrue(ud.getUsername().equals("ADMIN"));
+        Assert.assertEquals("ADMIN", ud.getUsername());
+        Assert.assertEquals("PWD", ud.getPassword());
+        Assert.assertEquals("ROLE_ADMIN", ud.getAuthorities().iterator().next().getAuthority());
+        Assert.assertEquals(1, ud.getAuthorities().size());
 
-        Assert.assertTrue(userService.getUserAuthorities().size() > 0);
+        Assert.assertTrue(userService.getUserAuthorities().contains("ROLE_ADMIN"));
     }
 }