閱讀834 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《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.MyAuthDzookeeper.authProvider.x=com.f.MyAuth2,那麼隻有其中一個會被使用。另外所有的服務器必須擁有相同的被定義插件,否則使用了插件提供的身份驗證schemes的客戶端們將會在連接到某些服務器時發生很多問題。

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 15:32:06

  上一篇:go  緩存穿透、緩存並發、緩存失效之思路變遷
  下一篇:go  Apache Commons Pool官方文檔