zookeeper相關create以及ACL許可權
客戶端
初始化zookeeper
建立zookeeper節點
api:
create(final String path, byte data[], List<ACL> acl,
CreateMode createMode);
使用方式
String returnPath = zooKeeper.create(path, "data".getBytes(), Ids.READ_ACL_UNSAFE,
CreateMode.PERSISTENT);
path =節點路徑
data=要存放的資料
acl = 許可權控制
CreateMode = 建立模式
acl 許可權控制
zookeeper內部封裝了Perm型別,包含5種許可權型別:
READ,WRITE ,CREATE ,DELETE,ADMIN ,以及ALL = 五合一型別
以及封裝了Id型別在Ids類中,包含2種模式:用來和Perm結合行成ACl
ANYONE_ID_UNSAFE = new Id("world", "anyone"); //誰都可以用模式
AUTH_IDS = new Id("auth", "");//由使用者去做具體的模式設定後,結合起來使用
模式分別有:ip,digest,world,super
在Ids類中,還封裝了3種複合模式,幫我們new 好了Acl的list,可以直接使用
//公開,無需許可權模式 public final ArrayList<ACL> OPEN_ACL_UNSAFE = new ArrayList<ACL>( Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID_UNSAFE))); //建立者們擁有全部的許可權,auth需要我們在new的時候自行設定對應的模式 public final ArrayList<ACL> CREATOR_ALL_ACL = new ArrayList<ACL>( Collections.singletonList(new ACL(Perms.ALL, AUTH_IDS))); //只讀模式 public final ArrayList<ACL> READ_ACL_UNSAFE = new ArrayList<ACL>( Collections .singletonList(new ACL(Perms.READ, ANYONE_ID_UNSAFE)));
模式 具體參考從Paxos到Zookeeper書的p266左右*頁左右
ip:增對ip粒度來進行許可權控制,也可以通過ip段來控制,比如“ip:192.168.0.1/24” 表示192.168.0.*這個ip段
digest: zooKeeper.addAuthInfo(“digest”,”username:password”.getBytes()); //使用者名稱密碼模式
如果是在命令列直接使用,通過DigestAuthenticationProvider.generateDigest(idPassword)
方法, 獲得對應的加密後Base64(SHA-1(Username:password))的password
然後在命令列輸入 getAcl /path ‘digest’,’username:生成的password’
world:對所有使用者開放許可權,只有一個許可權標識“world:anyone”
super:超級使用者,可以對任意zookeeper上的資料節點進行任何操作
自定義許可權模式:通過AuthenticationProvider類實現,不展開
CreateMode 建立模式
持久化的:客戶端斷開不會消失,永久存在的
臨時的:客戶端斷開後節點消失
覆蓋的:建立的時候返回的path等於輸入的path
順序遞增的:建立的時候返回的path等於輸入的path後加上一個遞增的數字
建立模式共4種
PERSISTENT //持久節點
PERSISTENT_SEQUENTIAL //持久節點並且順序遞增的
EPHEMERAL //臨時節點
EPHEMERAL_SEQUENTIAL //臨時節點,並且順序遞增的
新增許可權
對已經存在的節點新增許可權,通過方法
public Stat setACL(final String path, List<ACL> acl, int version)
public void setACL(final String path, List<ACL> acl, int version,
StatCallback cb, Object ctx)
給客戶端設定許可權,用來通過許可權校驗
zooKeeper.addAuthInfo("digest","username:password".getBytes());