一 Token身份驗證概述
Pulsar支持使用基於JSON Web Tokens(RFC-7519)的安全令牌對客戶端進行身份驗證。
Tokens用於標識Pulsar客戶端,並與角色關聯,這些角色隨後將被授予執行某些操作的權限(例如:發佈或使用某個主題)。
管理員通常會給客戶端一個令牌字符串用於連接時使用。
JWT支持兩種不同的密鑰來生成和效驗令牌
1 對稱密鑰
有一個密鑰用於生成令牌和效驗
2 非對稱密鑰,有一對密鑰,私鑰和公鑰
私鑰用於生成令牌
公鑰用於生成效驗
二 驗證 首先成生超級管理員令牌
以下使用 對稱密鑰 例子驗證(Pulsar2.4.2版本)
1 創建密鑰
$ bin/pulsar tokens create-secret-key --output my-secret.ke
生成base64編碼的私鑰
$ bin/pulsar tokens create-secret-key --output /data/apache-pulsar-2.4.2/my-secret.key --base64
2 生成令牌(注:首先生成 superUserRoles 角色令牌)
令牌是與用戶關聯的憑據,關聯是通過角色”來完成的。
以下命令是給 test-user 角色生成令牌
bin/pulsar tokens create --secret-key file:///data/apache-pulsar-2.4.2/my-secret.key \
--subject test-user
執行此命令後,屏目上會輸出此角色令牌,記錄此令牌,後邊客戶端配置會用到。
假設生成令牌:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw
3 Brokers啓用令牌身份驗證
配置broker.conf
authenticationEnabled=true
authorizationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
tokenSecretKey=file:///data/apache-pulsar-2.4.2/my-secret.key
#超級用戶角色,擁有最高權限,多個使用逗號隔開
superUserRoles=test-user
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
brokerClientAuthenticationParameters=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw
4 重新啓動Broker後,此時Broker服務已啓動Token身份驗證
執行$ pulsar-admin tenants list命令會提示沒有權限。
5 配置client.conf 使用命令行工具有權限使用
authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
#此處配置的令牌是上邊成生的超級管理員令牌
authParams=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw
6 重新啓動Broker後,命令行工具可以正常使用
7 java 客戶端驗證
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://192.168.1.48:6650/")
.authentication( AuthenticationFactory.token("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw") .build();
三 生成一般用戶令牌,給客戶端使用
1 生成一個新角色(test-user1)令牌
bin/pulsar tokens create --secret-key file:///data/apache-pulsar-2.4.2/my-secret.key \
--subject test-user1
假設計成生的令牌是(eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIxIn0.HHpjQYfqqdUSN_iAw79qjsPqHyPFvscvGUANvjQNEOo)
2 授權
bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \
--role test-user1 \
--actions produce,consume
3 JAVA 客戶端驗證,發送消息或接收消息正常說明成功
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://192.168.1.48:6650/")
.authentication( AuthenticationFactory.token("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIxIn0.HHpjQYfqqdUSN_iAw79qjsPqHyPFvscvGUANvjQNEOo") .build();