You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:41:01