权限控制范围包括库级别(全局)、表级别、列簇级别和列级别,目前总共有五种级别,分别是 READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A') 其中Exec 目前没有使用,CREATE,ADMIN只涉及库级别和表级别,列簇级别和列级别只涉及到READ和WRITE权限。
Hbase 提供了相应的api 来操作用户的访问控制。涉及的类主要有以下几个
org.apache.hadoop.hbase.security.access.AccessController
这是对所有访问进行拦截的入口,它既是MasterObserver又是RegionObserver,言下之意,它能拦截所有的操作
org.apache.hadoop.hbase.security.access.AccessControlLists
管理由AccessController 授权的权限列表
org.apache.hadoop.hbase.security.access.TableAuthManager
负责对用户进行权限检测。该类的实例缓存了所有的用户Permission。
下面举几个简单的例子。来展示下Hbase 的权限访问控制是如何实现的
public static void grant(final String userName,final String tableName,final String columnFamily,final String qulifier) throws IOException, InterruptedException{ User user = User.create(UserGroupInformation.createRemoteUser("root")); System.out.println("user.isSecurityEnabled:"+User.isSecurityEnabled()); user.runAs(new PrivilegedExceptionAction<Object>(){ @Override public Object run()throws Exception{ HTable acl = new HTable(conf, AccessControlLists.ACL_TABLE_NAME); try { BlockingRpcChannel service = acl.coprocessorService(Bytes.toBytes("scores")); AccessControlService.BlockingInterface protocol = AccessControlService.newBlockingStub(service); ProtobufUtil.grant(protocol, userName, TableName.valueOf(tableName), Bytes.toBytes(columnFamily), Bytes.toBytes(qulifier), Action.READ,Action.WRITE); } finally { acl.close(); } return null; } } ); }