java zookeeper權限控制ACL(auth,digest,ip)
學習前請參考:https://www.cnblogs.com/zwcry/p/10407806.html
zookeeper權限控制常用的就三種
1.auth 用戶名:密碼
將節點權限改為auth認證,但不加密。每次操作數據需要auth登錄認證。
2.digest 用戶名:加密(密碼)
將節點權限改為auth認證,需digest加密(sha1)。每次操作數據需要auth登錄認證。
3.ip 192.168.x.x
將節點權限改為限定ip訪問
代碼只寫到digest和ip權限控制,至於auth明文,小朋友們可以手動寫下測測。
ACL.java
package com.qy.zk; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs.Perms; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Id; import org.apache.zookeeper.data.Stat; import org.apache.zookeeper.server.auth.DigestAuthenticationProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 描述:zookeeper節點訪問權限,權限定以后,每次操作數據,需要auth認證登錄或在ip限定的客服端訪問 * 代碼里也有寫到如何auth認證登錄 zk.addAuthInfo * 作者:七脈 */
public class MyZkAcl { private static final Logger log = LoggerFactory.getLogger(MyZkAcl.class); public static void main(String[] args) throws IOException, InterruptedException, KeeperException, NoSuchAlgorithmException { ZooKeeper zk = MyZkConnect.connect(); /**創建一個節點,再進行測試**/
//該方法里的權限是 anyone word,crwda
MyZkConnect.create(zk, "/myacl", "myacl"); /**更改權限控制,指定用戶名密碼並digest加密**/
//digestAcL(zk, "/myacl");
/**更改權限控制,限定IP**/ ipAcL(zk, "/myacl"); } /** * 描述:將節點權限改為crwda,用戶名密碼為lry:123456並digest加密 * 作者:七脈 * @param zk * @param nodePath * @return * @throws KeeperException * @throws InterruptedException * @throws NoSuchAlgorithmException */
public static Stat digestAcL(ZooKeeper zk, String nodePath) throws KeeperException, InterruptedException, NoSuchAlgorithmException{ log.info("准備權限修改節點 {} ACL",nodePath); Stat stat = MyZkConnect.queryStat(zk, nodePath); List<ACL> acls = new ArrayList<>(); //scheme 有world/auth/digest/host/ip/ //zk的digest是通過sha1加密
String scheme = "digest"; //定義一個用戶名密碼為lry:123456
Id id = new Id(scheme, DigestAuthenticationProvider.generateDigest("lry:123456")); ACL acl = new ACL(Perms.ALL, id); acls.add(acl); //如果修改已經加密的節點,請先按原用戶密碼認證登錄 //zk.addAuthInfo(scheme, "lry:123456".getBytes());
Stat newstat = zk.setACL(nodePath, acls, stat.getAversion()); log.info("完成權限修改節點 {} ACL",nodePath); return newstat; } /** * 描述:將節點權限改為crwda,並限制指定IP * 作者:七脈 * @param zk * @param nodePath * @return * @throws KeeperException * @throws InterruptedException * @throws NoSuchAlgorithmException */
public static Stat ipAcL(ZooKeeper zk, String nodePath) throws KeeperException, InterruptedException, NoSuchAlgorithmException{ log.info("准備權限修改節點 {} ACL",nodePath); Stat stat = MyZkConnect.queryStat(zk, nodePath); List<ACL> acls = new ArrayList<>(); //scheme 有world/auth/digest/host/ip/ //zk的digest是通過sha1加密
String scheme = "ip"; //定義權限IP(如果是vm虛擬機,ip為虛擬ip)
Id id = new Id(scheme, "192.168.159.1"); ACL acl = new ACL(Perms.ALL, id); acls.add(acl); //如果修改已經加密的節點,請先按原用戶密碼認證登錄 //zk.addAuthInfo("digest", "lry:123456".getBytes());
Stat newstat = zk.setACL(nodePath, acls, stat.getAversion()); log.info("完成權限修改節點 {} ACL",nodePath); return newstat; } }
不明白的地方,代碼里都有注釋。相關的類可以在https://www.cnblogs.com/zwcry/p/10407806.html復制,也可以下載源碼