Zookeeper_安全认证讲解
生活随笔
收集整理的這篇文章主要介紹了
Zookeeper_安全认证讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比如ACL的認證
ACL的全稱就是Access Control List,這個認證它是做什么事呢,你想修改這個節點,你可以加一個認證操作,認證一般有這4種模式,IP模式,digest模式,world模式,super模式,其實沒有太大的用,相當于別的客戶端訪問我zookeeper服務器的時候,得有一個認證,才能允許你修改節點,要不然就不讓你去修改,你自己有興趣可以去看一看,咱們其實去運行一下DEMO就行了
?
package com.learn.zookeeper.auth;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat;/*** * @author Leon.Sun**/ public class ZookeeperAuth implements Watcher {/** 連接地址 */final static String CONNECT_ADDR = "localhost:2181";/** 測試路徑 *//*** 這里有一個testAuth的路徑*/final static String PATH = "/testAuth";/*** 就是有兩個路徑* 一個是父節點parent* 還有一個是子節點delNode* */final static String PATH_DEL = "/testAuth/delNode";/** 認證類型 *//*** 認證類型就是用digest* 這種類型也是最常用的* 控制權限* 首先把你這個認證進行兩次的處理* 第一次使用SHA-1* 加密算法去加密* BASE64編碼* */final static String authentication_type = "digest";/** 認證正確方法 *//*** 第一次去連的時候需要輸入一個字符串* 以后機器連的時候必須使用一樣的字符串才能修改* 如果你想輸入錯誤的不允許修改* 其實就是一個非常easy的事* 是從網上copy的一段代碼* 這不是我寫的* 但是這么做已經足夠了* */final static String correctAuthentication = "123456";/** 認證錯誤方法 */final static String badAuthentication = "654321";static ZooKeeper zk = null;/** 計時器 */AtomicInteger seq = new AtomicInteger();/** 標識 */private static final String LOG_PREFIX_OF_MAIN = "【Main】";private CountDownLatch connectedSemaphore = new CountDownLatch(1);@Overridepublic void process(WatchedEvent event) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}if (event==null) {return;}// 連接狀態KeeperState keeperState = event.getState();// 事件類型EventType eventType = event.getType();// 受影響的pathString path = event.getPath();String logPrefix = "【Watcher-" + this.seq.incrementAndGet() + "】";System.out.println(logPrefix + "收到Watcher通知");System.out.println(logPrefix + "連接狀態:\t" + keeperState.toString());System.out.println(logPrefix + "事件類型:\t" + eventType.toString());if (KeeperState.SyncConnected == keeperState) {// 成功連接上ZK服務器if (EventType.None == eventType) {System.out.println(logPrefix + "成功連接上ZK服務器");connectedSemaphore.countDown();} } else if (KeeperState.Disconnected == keeperState) {System.out.println(logPrefix + "與ZK服務器斷開連接");} else if (KeeperState.AuthFailed == keeperState) {System.out.println(logPrefix + "權限檢查失敗");} else if (KeeperState.Expired == keeperState) {System.out.println(logPrefix + "會話失效");}System.out.println("--------------------------------------------");}/*** 創建ZK連接* * createConnection的時候* 第一次創建連接的時候* * * @param connectString* ZK服務器地址列表* @param sessionTimeout* Session超時時間*/public void createConnection(String connectString, int sessionTimeout) {this.releaseConnection();try {/*** zookeeper加的東西是啥* 肯定是this* 就是一個Watcher* 加了一個Watcher* * */zk = new ZooKeeper(connectString, sessionTimeout, this);//添加節點授權/*** 就是多了一個這個方法* 這是zookeeper原生帶的一個方法* 就是提供認證* 就是你第一次連接zookeeper的時候* 你得加一個認證* 認證的type就是上面的digest* 這個字符串是固定的* 當然你也可以用其他的* 一般這種方式是最常用的* 把這句話寫到了這一行了* 第一次連接的時候加上這個字符串* authentication_type這個相當于一個key了* correctAuthentication.getBytes()這個是value* 這個value是自己隨便寫的* 我這寫的是123456* 也就是我以后再連接zookeeper的時候* 就是對這個節點進行增刪改查的時候* 我只能是加上這個認證才能去修改* 要不然是不能去修改的* 沒有認證是不好使的* 說白了就是這么一個簡單的東西* 其他的方式其實也都差不多* 通過IP指定一臺機器* 只能這一臺機器進行修改* 其他機器是不允許修改* 就是之前說的IP的模式* 還有是world的模式* 這個是開放的* 這是一種特殊的digest* 他僅僅是一個標識而已* 還有一種是super* 超級用戶模式* 基本上最常用的也就是這個了* IP就是指定了一臺機器* 或者是按網段進行分配* 192.168.1.** 簡單的說完這些事情* 咱們看一下吧* 連完zookeeper以后* 創建完connection之后* * 自己定義的時候要加一個認證* key是不變的* value就相當于你的密碼一樣的* 你可以自己隨便定義一個很復雜的密碼* zk這個對象創建所有的節點* 由于zk加認證創建的節點* */zk.addAuthInfo(authentication_type,correctAuthentication.getBytes());System.out.println(LOG_PREFIX_OF_MAIN + "開始連接ZK服務器");//倒數等待connectedSemaphore.await();} catch (Exception e) {e.printStackTrace();}}/*** 關閉ZK連接*/public void releaseConnection() {if (this.zk!=null) {try {this.zk.close();} catch (InterruptedException e) {}}}/*** * <B>方法名稱:</B>測試函數<BR>* <B>概要說明:</B>測試認證<BR>* @param args* @throws Exception*/public static void main(String[] args) throws Exception {ZookeeperAuth testAuth = new ZookeeperAuth();testAuth.createConnection(CONNECT_ADDR,2000);List<ACL> acls = new ArrayList<ACL>(1);for (ACL ids_acl : Ids.CREATOR_ALL_ACL) {acls.add(ids_acl);}try {/*** 就是創建的時候要加上acls認證* * 這個認證是zookeeper給你提供的* for循環加到list里就行了* 你加上這個認證以后* 那這個節點需要認證才能去刪除* 我這邊連zookeeper是可以連上* 我可以連上zookeeper* 我要修改你剛創建的path節點* 你要有一個認證才行* 沒有認證是不行的* 要理解這個事情* create(String path, byte[] data, List<ACL> acl, CreateMode createMode) * create的時候要傳一個list* 或者你穿其他的也行* 創建節點的時候需要指定一種方式* 你千萬要注意一點* 你創建一個節點的是有認證的* 我再創建一個新的節點* 這個認證只是針對于這一個節點* 我的zookeeper只要操作一個新的節點* 我是可以不加任何認證的* 那個認證只是針對于某一個節點* 要明白這個事情*/zk.create(PATH, "init content".getBytes(), acls, CreateMode.PERSISTENT);System.out.println("使用授權key:" + correctAuthentication + "創建節點:"+ PATH + ", 初始內容是: init content");} catch (Exception e) {e.printStackTrace();}try {zk.create(PATH_DEL, "will be deleted! ".getBytes(), acls, CreateMode.PERSISTENT);System.out.println("使用授權key:" + correctAuthentication + "創建節點:"+ PATH_DEL + ", 初始內容是: init content");} catch (Exception e) {e.printStackTrace();}// 獲取數據getDataByNoAuthentication();getDataByBadAuthentication();getDataByCorrectAuthentication();// 更新數據updateDataByNoAuthentication();updateDataByBadAuthentication();updateDataByCorrectAuthentication();// 刪除數據deleteNodeByBadAuthentication();deleteNodeByNoAuthentication();deleteNodeByCorrectAuthentication();//Thread.sleep(1000);deleteParent();//釋放連接testAuth.releaseConnection();}/** 獲取數據:采用錯誤的密碼 *//*** 使用錯的* 錯誤的是什么意思* */static void getDataByBadAuthentication() {String prefix = "[使用錯誤的授權信息]";try {/*** 我連zookeeper的時候用認證* 但是認證不對啊* 我加了一個認證* 但是是一個錯誤的認證*/ZooKeeper badzk = new ZooKeeper(CONNECT_ADDR, 2000, null);//授權/*** 我加的是一個bad的認證badAuthentication* 上面寫的是什么* 正確的是123456* 我寫的是654321* 這個時候如果你認證寫654321的時候* 那就不行了* 就認證失敗了* 打印的就是認證失敗* [使用錯誤的授權信息]更新失敗,原因是:KeeperErrorCode = ConnectionLoss for /testAuth* 使用的是error* 為什么啊* 如果這個改成正確的呢* badAuthentication* 不就是123456嗎* */badzk.addAuthInfo(authentication_type,badAuthentication.getBytes()); // badzk.addAuthInfo(authentication_type,"123456".getBytes());Thread.sleep(2000);System.out.println(prefix + "獲取數據:" + PATH);System.out.println(prefix + "成功獲取數據:" + badzk.getData(PATH, false, null));} catch (Exception e) {System.err.println(prefix + "獲取數據失敗,原因:" + e.getMessage());}}/** 獲取數據:不采用密碼 *//*** 沒有認證的情況* */static void getDataByNoAuthentication() {String prefix = "[不使用任何授權信息]";try {System.out.println(prefix + "獲取數據:" + PATH);/*** 直接new一個ZooKeeper去連接* 拿到這個nozk去get* */ZooKeeper nozk = new ZooKeeper(CONNECT_ADDR, 2000, null);Thread.sleep(2000);/*** 這個是不允許的* */System.out.println(prefix + "成功獲取數據:" + nozk.getData(PATH, false, null));} catch (Exception e) {/*** 會產生一個失敗的信息* 就是會打印error這句話* */System.err.println(prefix + "獲取數據失敗,原因:" + e.getMessage());}}/** 采用正確的密碼 *//*** 只有正確的方式* 它是可以去獲取的* */static void getDataByCorrectAuthentication() {String prefix = "[使用正確的授權信息]";try {System.out.println(prefix + "獲取數據:" + PATH);System.out.println(prefix + "成功獲取數據:" + zk.getData(PATH, false, null));} catch (Exception e) {System.out.println(prefix + "獲取數據失敗,原因:" + e.getMessage());}}/*** 更新數據:不采用密碼*/static void updateDataByNoAuthentication() {String prefix = "[不使用任何授權信息]";System.out.println(prefix + "更新數據: " + PATH);try {ZooKeeper nozk = new ZooKeeper(CONNECT_ADDR, 2000, null);Thread.sleep(2000);Stat stat = nozk.exists(PATH, false);if (stat!=null) {nozk.setData(PATH, prefix.getBytes(), -1);System.out.println(prefix + "更新成功");}} catch (Exception e) {System.err.println(prefix + "更新失敗,原因是:" + e.getMessage());}}/*** 更新數據:采用錯誤的密碼*/static void updateDataByBadAuthentication() {String prefix = "[使用錯誤的授權信息]";System.out.println(prefix + "更新數據:" + PATH);try {ZooKeeper badzk = new ZooKeeper(CONNECT_ADDR, 2000, null);//授權badzk.addAuthInfo(authentication_type,badAuthentication.getBytes());Thread.sleep(2000);Stat stat = badzk.exists(PATH, false);if (stat!=null) {badzk.setData(PATH, prefix.getBytes(), -1);System.out.println(prefix + "更新成功");}} catch (Exception e) {System.err.println(prefix + "更新失敗,原因是:" + e.getMessage());}}/*** 更新數據:采用正確的密碼*/static void updateDataByCorrectAuthentication() {String prefix = "[使用正確的授權信息]";System.out.println(prefix + "更新數據:" + PATH);try {Stat stat = zk.exists(PATH, false);if (stat!=null) {zk.setData(PATH, prefix.getBytes(), -1);System.out.println(prefix + "更新成功");}} catch (Exception e) {System.err.println(prefix + "更新失敗,原因是:" + e.getMessage());}}/*** 不使用密碼 刪除節點*/static void deleteNodeByNoAuthentication() throws Exception {String prefix = "[不使用任何授權信息]";try {System.out.println(prefix + "刪除節點:" + PATH_DEL);ZooKeeper nozk = new ZooKeeper(CONNECT_ADDR, 2000, null);Thread.sleep(2000);Stat stat = nozk.exists(PATH_DEL, false);if (stat!=null) {nozk.delete(PATH_DEL,-1);System.out.println(prefix + "刪除成功");}} catch (Exception e) {System.err.println(prefix + "刪除失敗,原因是:" + e.getMessage());}}/*** 采用錯誤的密碼刪除節點*/static void deleteNodeByBadAuthentication() throws Exception {String prefix = "[使用錯誤的授權信息]";try {System.out.println(prefix + "刪除節點:" + PATH_DEL);ZooKeeper badzk = new ZooKeeper(CONNECT_ADDR, 2000, null);//授權badzk.addAuthInfo(authentication_type,badAuthentication.getBytes());Thread.sleep(2000);Stat stat = badzk.exists(PATH_DEL, false);if (stat!=null) {badzk.delete(PATH_DEL, -1);System.out.println(prefix + "刪除成功");}} catch (Exception e) {System.err.println(prefix + "刪除失敗,原因是:" + e.getMessage());}}/*** 使用正確的密碼刪除節點*/static void deleteNodeByCorrectAuthentication() throws Exception {String prefix = "[使用正確的授權信息]";try {System.out.println(prefix + "刪除節點:" + PATH_DEL);Stat stat = zk.exists(PATH_DEL, false);if (stat!=null) {zk.delete(PATH_DEL, -1);System.out.println(prefix + "刪除成功");}} catch (Exception e) {System.out.println(prefix + "刪除失敗,原因是:" + e.getMessage());}}/*** 使用正確的密碼刪除節點*/static void deleteParent() throws Exception {try {Stat stat = zk.exists(PATH_DEL, false);if (stat == null) {zk.delete(PATH, -1);}} catch (Exception e) {e.printStackTrace();}}}?
總結
以上是生活随笔為你收集整理的Zookeeper_安全认证讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper_watch机制核心讲
- 下一篇: Zookeeper_实际应用讲解