如何用Java代码实现Apache Ranger配置下的HBase用户认证与授权测试
嘿,刚好我之前在项目里折腾过Ranger+HBase的权限管控,给你拆解下用Java代码实现用户认证和授权测试的具体步骤,亲测好使👇
一、Java代码实现Ranger配置下的HBase用户认证
Ranger是基于HBase自身的认证体系做权限管控的,所以第一步得先让Java客户端通过HBase的认证,常见的两种认证场景:
1. 简单认证(Simple Auth,适合测试环境)
如果你的HBase集群用的是简单用户名认证,配置和代码如下:
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.UserProvider; import org.apache.hadoop.conf.Configuration; public class HBaseRangerAuthTest { public static void main(String[] args) throws Exception { // 初始化HBase配置 Configuration conf = HBaseConfiguration.create(); // 配置ZooKeeper地址,换成你集群的地址 conf.set("hbase.zookeeper.quorum", "zk1,zk2,zk3"); conf.set("hbase.zookeeper.property.clientPort", "2181"); // 启用简单认证模式 conf.set("hbase.security.authentication", "simple"); // 创建并绑定测试用户到当前线程 UserProvider userProvider = UserProvider.instantiate(conf); // 这里替换成你在Ranger里创建的测试用户名 User testUser = userProvider.createUserForTesting("ranger-test-user", new String[]{}); testUser.login(conf); System.out.println("当前认证用户:" + testUser.getShortName()); } }
2. Kerberos认证(生产环境常用)
如果是生产环境的Kerberos认证,需要配置keytab和principal信息:
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.UserProvider; import org.apache.hadoop.conf.Configuration; public class HBaseRangerKerberosAuthTest { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "zk1,zk2,zk3"); conf.set("hbase.zookeeper.property.clientPort", "2181"); // 启用Kerberos认证 conf.set("hbase.security.authentication", "kerberos"); // 配置HBase服务端的Kerberos主体 conf.set("hbase.master.kerberos.principal", "hbase/_HOST@YOUR-REALM.COM"); conf.set("hbase.regionserver.kerberos.principal", "hbase/_HOST@YOUR-REALM.COM"); // 配置客户端的Kerberos信息 System.setProperty("java.security.krb5.conf", "/etc/krb5.conf"); conf.set("hbase.client.keytab.file", "/path/to/test-user.keytab"); conf.set("hbase.client.kerberos.principal", "test-user@YOUR-REALM.COM"); // 完成Kerberos登录 UserProvider userProvider = UserProvider.instantiate(conf); User testUser = userProvider.getCurrent(); testUser.login(conf); System.out.println("Kerberos认证成功,当前用户:" + testUser.getShortName()); } }
二、Java代码传递用户信息测试HBase授权功能
认证通过后,就可以执行HBase操作来验证Ranger的权限策略是否生效了。比如测试读、写、创建表的权限:
import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; public class HBaseRangerAuthorizationTest { public static void main(String[] args) throws Exception { // 这里复用上面的认证配置conf Configuration conf = getAuthenticatedConf(); // 替换成你上面的认证配置方法 // 测试读权限 try (Connection conn = ConnectionFactory.createConnection(conf); Table table = conn.getTable(TableName.valueOf("test_table"))) { Get get = new Get(Bytes.toBytes("test_row")); Result result = table.get(get); System.out.println("读取数据成功,权限验证通过:" + result); } catch (AccessDeniedException e) { System.out.println("读取被拒绝,符合Ranger权限配置:" + e.getMessage()); } // 测试写权限 try (Connection conn = ConnectionFactory.createConnection(conf); Table table = conn.getTable(TableName.valueOf("test_table"))) { Put put = new Put(Bytes.toBytes("new_row")); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col"), Bytes.toBytes("new_value")); table.put(put); System.out.println("写入数据成功,权限验证通过"); } catch (AccessDeniedException e) { System.out.println("写入被拒绝,符合Ranger权限配置:" + e.getMessage()); } } // 封装认证配置的方法,对应上面的Simple或Kerberos认证逻辑 private static Configuration getAuthenticatedConf() throws Exception { Configuration conf = HBaseConfiguration.create(); // 这里添加你的认证配置逻辑,比如Simple Auth的参数 conf.set("hbase.zookeeper.quorum", "zk1,zk2,zk3"); conf.set("hbase.security.authentication", "simple"); UserProvider userProvider = UserProvider.instantiate(conf); User testUser = userProvider.createUserForTesting("ranger-test-user", new String[]{}); testUser.login(conf); return conf; } }
关键注意事项
- 确保你在Ranger里已经给测试用户配置了对应的HBase权限策略(比如
ranger-test-user对test_table的读/写权限) - 客户端依赖要正确,比如Maven需要引入:
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>你的HBase版本号</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>你的HBase版本号</version> </dependency> </dependencies>
- 测试时,如果权限不生效,先检查Ranger的policy是否已经同步到HBase集群(Ranger有自动同步机制,也可以手动触发同步)
内容的提问来源于stack exchange,提问作者pujara
相关产品推荐
相关产品推荐

