《Apache Zookeeper 官方文件》ZooKeeper可插入式身份認證
原文地址
ZooKeeper執行在帶有數量眾多並且各不相同的身份認證schemes(檢視)的各種不同環境中,所以它擁有完整的可插入式身份驗證框架。甚至它內建的身份驗證schemes也使用了可插入式身份驗證框架。
想搞清楚身份驗證框架式是如何工作的,你首先必須弄明白兩個主要的身份驗證操作。該框架首先必須驗證客戶端(client)。這一步通常都會被完成只要客戶端連線到伺服器並且它包含了從伺服器傳送過來或收集到相關的關於客戶端與連線進行關聯的驗證資訊。第二步由框架處理的操作時找出一個對客戶端進行響應的ACL中的entries(我翻譯成“標識”)。ACL entries是一對<idspec, permissions>對。Idspec可能是一個匹配關聯連線的驗證資訊的簡單字串(simple string)或者它也可能是一個用來評估該驗證資訊的表示式(expression)、它關注於實現身份驗證外掛的匹配。這裡是身份驗證外掛中必須被實現的介面:
public interface AuthenticationProvider {
String getScheme();
KeeperException.Code handleAuthentication(ServerCnxn cnxn, byte authData[]);
boolean isValid(String id);
boolean matches(String id, String aclExpr);
boolean isAuthenticated();
}
第一個方法“getScheme”返回一個驗證外掛的字串。因為我們支援多樣化身份驗證的方法,而一個身份驗證憑證或一個idspec通常會帶有scheme,所以ZooKeeper伺服器通過身份驗證外掛返回的scheme去確定是哪一個ids被scheme應用了。
一個客戶端傳送身份驗證資訊去跟連線進行關聯,(這一步驟)通常被稱為“處理身份驗證”(handleAuthentication)。客戶端將shceme指定給那些響應資訊。ZooKeeper伺服器將該資訊傳遞給那些getScheme與客戶端傳遞過來的scheme相匹配的身份驗證外掛。如果handleAuthentication的實現(implementation)確定該資訊是壞的它通常都會返回一個錯誤,然後它會使用cnxn.getAuthInfo().add(new Id(getScheme(), data))方法與連線關聯資訊。
身份驗證外掛在設定和使用ACLs(的情況)中都被呼叫了。當一個ACL因為znode而被建立時,ZooKeeper伺服器將會傳遞部分標識(entry)的id給isValid(String id)方法。它被外掛用來驗證id是否擁有一個正確的form(找不到合適譯意)。舉個例子,IP:172.16.0.0/16是一個非法id,但ip:host.com卻是合法的。如果一個新的ACL包含了一個“auth”標識,那麼“isAuthenticated”會被使用來判斷這個與連線相關聯的scheme的身份驗證資訊是否應該被加到ACL裡。一些schemes不應該被包含在auth裡。比如,如果auth被(使用者)指定了那麼客戶端的IP地址不會被視為一個應該被加入到ACL裡的id。
在檢查一個ACL的時候ZooKeeper會呼叫matches(String id, String aclExpr)方法。它需要匹配對應的含有相關ACL標識的客戶端它的身份驗證資訊。為了找出那些被應用到客戶端的標識,ZooKeeper伺服器將會找出每一個標識的scheme,同時,如果有一個來自對應scheme的客戶端驗證資訊,matches(String id, String aclExpr)方法會在使用了提前被新增到handleAuthentication連線的驗證資訊的id和用於ACL標識id的aclExpr這兩個引數後被呼叫。身份驗證外掛裡含有兩個內建物件:iP和digest。通過使用系統properties可以新增額外外掛。啟動的時候ZooKeeper伺服器會查詢以“zookeeper.authProvider”開頭的系統properties並且解析那些properties裡面的值,比如一個身份驗證外掛的類名。通過使用“Dzookeeper.authProvider.X=com.f.MyAuth”可以建立那些properties,或者你可以像下面一樣在伺服器配置檔案裡新增標識:
authProvider.1=com.f.MyAuth
authProvider.2=com.f.MyAuth2
應該注意的是我們要確保property的字尾是獨一無二的。如果有相同的比如:
Dzookeeper.authProvider.x=com.f.MyAuth
和Dzookeeper.authProvider.x=com.f.MyAuth2
,那麼只有其中一個會被使用。另外所有的伺服器必須擁有相同的被定義外掛,否則使用了外掛提供的身份驗證schemes的客戶端們將會在連線到某些伺服器時發生很多問題。
第一次翻譯,有很多不懂,錯誤也在所難免。所以如果發現錯誤,謝謝大家指出。
我的部落格(CSDN):PursueCloud