在ZooKeeper中,可以爲節點設置權限,這樣只有用戶對應權限的客戶端才能訪問到指定的節點。
ZooKeeper中的權限認證可以分爲 scheme、id、permission。其中scheme爲驗證的種類,id爲對應類型中的登錄id,permission爲登錄id的權限。
一、scheme:
其中scheme分爲四種:
world:默認方式,即所有人都可以訪問。
auth:使用id來進行驗證,可以認爲是直接傳入 userName:passWord 來進行驗證
digest:也是使用用戶名:密碼的形式進行驗證,不過要對passWord進行MD5哈希,然後再進行bese64。
ip:使用ip地址進行驗證。
下面重點講一下world與digest:
1、world:
我們默認創建節點的時候使用 world,即 world:anyone:cdrwa ,使用的時候,可以:
setAcl / world:anyone:cdrwa
此爲創建 / 節點的驗證爲所有人都可以增刪改查。
2、digest:
即賬號密碼驗證,比如賬號密碼爲 heng 123456 ,那麼驗證之後的爲 BASE64(SHA1(xxx) ,即 BASE64(SHA1(heng+123456),可以使用zooKeeper中的工具來獲取:
java -Djava.ext.dirs=/Users/happyheng/Java/zookeeper-3.4.13/lib -cp /Users/happyheng/Java/zookeeper-3.4.13/zookeeper-3.4.13.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider heng:123456
即返回 heng:123456->heng:2uqILaYfnmo+aZZ4eZ3Bmr1mJq0=
所以,可以使用 heng:2uqILaYfnmo+aZZ4eZ3Bmr1mJq0=
所以,添加權限的時候可以用:
create "/digest" "" digest:heng:2uqILaYfnmo+aZZ4eZ3Bmr1mJq0=:cdrwa
這時候再訪問 /digest 就返回權限不足,這時候通過 addauth 來添加權限:
addauth digest heng:123456
然後就可以訪問 /digest 了
二、id:
id與scheme相關聯,當scheme爲world的時候,id爲anyone,爲digest的時候,爲 賬號:密碼
三、permission:
permission即節點的訪問權限:
cdrwa分別爲:
1、創建子節點的權限
2、刪除節點的權限
3、讀取節點數據的權限
4、修改節點數據的權限
5、設置子節點權限的權限
即
Create 允許對子節點 Create 操作
Read 允許對本節點 GetChildren 和 GetData 操作
Write 允許對本節點 SetData 操作
Delete 允許對子節點 Delete 操作
Admin 允許對本節點 setAcl 操作
四、Curator增加權限驗證:
以上述 addauth digest heng:123456 爲例,在curator初始化時,可以這樣使用:
framework = CuratorFrameworkFactory.builder()
. . .
.authorization("digist", "heng:123456".getBytes())
. . .
.build();
framework.start();