http://www.cnblogs.com/yjmyzz/p/zookeeper-acl-demo.html
權(quán)限是疊加的
通過getAcl命令可以發(fā)現(xiàn),剛創(chuàng)建的節(jié)點橡淑,默認是 world,anyone的認證方式,具有cdrwa所有權(quán)限
繼續(xù)搗鼓:
先給/test增加了user1:+owfoSBn/am19roBPzR1/MfCblE的只讀(r)權(quán)限控制主儡,
說明:setAcl /test digest:用戶名:密碼:權(quán)限 給節(jié)點設(shè)置ACL訪問權(quán)限時暑诸,密碼必須是加密后的內(nèi)容,這里的+owfoSBn/am19roBPzR1/MfCblE=峰搪,對應(yīng)的原文是12345 (至于這個密文怎么得來的岔冀,后面會講到,這里先不管這個)概耻,設(shè)置完Acl后使套,可以通過
getAcl /節(jié)點路徑 查看Acl設(shè)置
然后get /test時,提示認證無效鞠柄,說明訪問控制起作用了侦高,接下來:
addauth digest user1:12345 給"上下文"增加了一個認證用戶,即對應(yīng)剛才setAcl的設(shè)置
然后再 get /test 就能取到數(shù)據(jù)了
最后 delete /test 成功了厌杜!原因是:根節(jié)點/默認是world:anyone:crdwa(即:全世界都能隨便折騰)奉呛,所以也就是說任何人,都能對根節(jié)點/進行讀期奔、寫侧馅、創(chuàng)建子節(jié)點、管理acl呐萌、以及刪除子節(jié)點(再次映證了ACL中的delete權(quán)限應(yīng)該理解為對子節(jié)點的delete權(quán)限)
剛才也提到了馁痴,setAcl /path digest這種方式,必須輸入密碼加密后的值肺孤,這在cli控制臺上很不方便罗晕,所以下面這種方式更常用:
注意加框的部分,先用addauth digest user1:12345 增加一個認證用戶赠堵,然后用 setAcl /test auth:user1:12345:r 設(shè)置權(quán)限小渊,跟剛才的效果一樣,但是密碼這里輸入的是明文茫叭,控制臺模式下手動輸入更方便酬屉。
//注:zkClient.setAcl方法查看源碼可以發(fā)現(xiàn),調(diào)用了readData揍愁、setAcl二個方法
//所以要修改節(jié)點的ACL屬性呐萨,必須同時具備read、admin二種權(quán)限
最后:關(guān)于多級節(jié)點之間的ACL莽囤,并非繼承關(guān)系谬擦,但是也有些一聯(lián)系,這是初次接觸ACL中比較難理解的地方:
從這張圖上可以發(fā)現(xiàn)朽缎,子節(jié)點/a/b的控制權(quán)限范圍(全世界都能做任何事)可以超出父節(jié)點的范圍(僅限:user-a:pwd:a具有read/admin權(quán)限)
繼續(xù)惨远,看上面的這4條紅線標(biāo)注的地方谜悟,從上向下一個個解釋:
紅線1:因為/a只有user-a:pwd-a有ra權(quán)限,即:沒用戶具有c(create)權(quán)限北秽,所以不能創(chuàng)建子節(jié)點
紅線2:因為/a/b為world:anyone:cdrwa權(quán)限葡幸,即無限制,所以在/a/b下創(chuàng)建子節(jié)點b1羡儿,地球人已經(jīng)無法阻止礼患,創(chuàng)建成功
紅線3:給/a/b/b1指定了user-b1:pwd-b1的da權(quán)限(即:delete+admin)
(注:重溫下前面提到的setAcl 二種模式,
一種是setAcl /path digest:username:encrypedpwd:crwda 用這種方式時掠归,encrypedpwd用戶必須是密文缅叠,
另一種方式是先addauth digest:usrname:password 先把授權(quán)信息加入上下文,這里password用的是明文虏冻,然后再setAcl /path auth:username:password:crdwa
所以如果在cli控制臺測試肤粱,強烈建議用第二種方式,否則象上圖中的方式用錯了方式厨相,pwd-b1在zk中被認為是密文领曼,要解密出來幾乎不可能,所以設(shè)置后蛮穿,相當(dāng)于這個節(jié)點就廢了庶骄,因為你不知道密碼,要操作該節(jié)點時践磅,提供不了正確的認證信息)
紅線4:還是剛才的理由单刁,因為/a/b為world:anyone:cdrwa,沒有限制府适,所以刪除其下的子節(jié)點不受阻擋羔飞。
從上圖可以看出,無法get父節(jié)點的內(nèi)容檐春,但是可以get子節(jié)點的內(nèi)容逻淌,再次說明父、子節(jié)點的權(quán)限沒直接關(guān)系疟暖,但是做delete時卡儒,上面的例子卻遇到了麻煩:
想刪除/a/b時,由于父節(jié)點/a的ACL列表里俐巴,只有ra權(quán)限朋贬,沒有d權(quán)限,所以無法刪除子節(jié)點窜骄。想刪除/a時,發(fā)現(xiàn)下面還有子節(jié)點b摆屯,節(jié)點非空無法刪除邻遏,所以這個示例就無解了(因為根據(jù)前面的操作糠亩,密碼也還原不出來,也就無法修改ACL屬性)准验,而根節(jié)點/也無法刪除赎线,解決辦法,只能到data目錄里清空所有數(shù)據(jù)糊饱,再重啟zk垂寥,但是這樣就相當(dāng)于所有數(shù)據(jù)全扔了,所以在設(shè)計ACL時另锋,對于delete權(quán)限滞项,要謹慎規(guī)劃,在測試zk集群上做好測試夭坪,再轉(zhuǎn)到生產(chǎn)環(huán)境操作文判。
最后給一些權(quán)限組合的測試結(jié)果:
要修改某個節(jié)點的ACL屬性,必須具有read室梅、admin二種權(quán)限
要刪除某個節(jié)點下的子節(jié)點戏仓,必須具有對父節(jié)點的read權(quán)限,以及父節(jié)點的delete權(quán)限