You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2016/06/24 07:05:18 UTC
[40/50] kylin git commit: minor, complete UserService
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/stream_m1
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"));
}
}