zookeeper acl許可權
總體來說,ZK的節點有5種操作許可權:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理許可權,這5種許可權簡寫為crwda(即:每個單詞的首字元縮寫)
注:這5種許可權中,delete是指對子節點的刪除許可權,其它4種許可權指對自身節點的操作許可權
身份的認證有4種方式:
world:預設方式,相當於全世界都能訪問
auth:代表已經認證通過的使用者(cli中可以通過addauth digest user:pwd 來添加當前上下文中的授權使用者)
digest:即使用者名稱:密碼這種方式認證,這也是業務系統中最常用的
ip:使用Ip地址認證
Cli命令列下可以這樣測試:
通過getAcl命令可以發現,剛建立的節點,預設是 world,anyone的認證方式,具有cdrwa所有許可權
繼續搗鼓:
先給/test增加了user1:+owfoSBn/am19roBPzR1/MfCblE的只讀(r)許可權控制,
說明:setAcl /test digest:使用者名稱:密碼:許可權 給節點設定ACL訪問許可權時,密碼必須是加密後的內容,這裡的+owfoSBn/am19roBPzR1/MfCblE=,對應的原文是12345 (至於這個密文怎麼得來的,後面會講到,這裡先不管這個),設定完Acl後,可以通過
getAcl /節點路徑
然後get /test時,提示認證無效,說明訪問控制起作用了,接下來:
addauth digest user1:12345 給"上下文"增加了一個認證使用者,即對應剛才setAcl的設定
然後再 get /test 就能取到資料了
最後 delete /test 成功了!原因是:根節點/預設是world:anyone:crdwa(即:全世界都能隨便折騰),所以也就是說任何人,都能對根節點/進行讀、寫、建立子節點、管理acl、以及刪除子節點(再次映證了ACL中的delete許可權應該理解為對子節點的delete許可權)
剛才也提到了,setAcl /path digest這種方式,必須輸入密碼加密後的值,這在cli控制檯上很不方便,所以下面這種方式更常用:
注意加框的部分,先用addauth digest user1:12345 增加一個認證使用者,然後用 setAcl /test auth:user1:12345:r 設定許可權,跟剛才的效果一樣,但是密碼這裡輸入的是明文,控制檯模式下手動輸入更方便。
好了,揭開加密規則:
1 2 3 4 5 6 7 |
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);
}
|
就是SHA1加密,然後base64編碼
程式碼使用:
zookeeper有一個很好用的客戶端開源專案zkclient,官網地址為:http://github.com/zkclient ,其最新片0.7-dev已經支援ACL了(舊0.1版無此功能,所以推薦使用最新版),使用方法:
git clone https://github.com/sgroschupf/zkclient (把程式碼拉到本地)
修改
build.gradle 找到92行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
uploadArchives
{
repositories.mavenDeployer
{
//repository(url:
"file:///tmp/mavenRepo")
repository(url:
|