歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

ZooKeeper使用ACL進行權限控制C++

C++中對zookeeper節點進行ACL權限控制資料少,讓人誤解。

zhandle_t *zk = zookeeper_init("127.0.0.1:5555", NULL, 10000, 0, NULL, 0);
char buffer[512];
char scheme[10]="digest";
char usr_pa[100]="test:V28q/NynI4JI3Rk54h0r8O5kMug=";
struct ACL_vector aclv;
aclv.count=1;
struct ACL acl;
acl.perms = ZOO_PERM_ALL;
acl.id.scheme = scheme;
acl.id.id = usr_pa;
aclv.data = &acl;
zoo_create(zk, "/mynode", "cluster", strlen("cluster"), &aclv, 0, buffer, sizeof(buffer)-1);

zoo_add_auth(zk,"digest","test:test",7,NULL,NULL);

memset(buffer,0,sizeof(buffer));
int buflen= sizeof(buffer);
struct Stat stat;
int rc = zoo_get(zk, "/mynode", 0, buffer, &buflen, &stat);
if (rc) {
    fprintf(stderr, "zoo_get Error %d for %d\n", rc, __LINE__);
}
printf("get buffer: %s\n", buffer);

rc = zoo_delete(zk, "/mynode", -1);
if (rc) {
    fprintf(stderr, "zoo_delete Error %d for %d\n", rc, __LINE__);
}
sleep(1000000);

其中對於希望使用的用戶名、密碼分別為user,passwd時: ACL的id中保存的字符串為user:base64encode(sha1(user:passwd)) 其中編碼為:單字符8位,字符集為ASCII 在java中有DigestAuthenticationProvider.java模塊插件可以進行此加密: 對應加密函數

static public String generateDigest(String idPassword)
        throws NoSuchAlgorithmException {
    String parts[] = idPassword.split(":", 2);
    byte digest[] = MessageDigest.getInstance("SHA1").digest(
            idPassword.getBytes());
    return parts[0] + ":" + base64Encode(digest);
}

在zkCli.sh命令行中: 創建節點create -s /test null digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:rwcda 讓zookeeper知道自己的權限addauth digest test:test 獲取節點數據get /test

ZooKeeper 的詳細介紹:請點這裡
ZooKeeper 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved