身份认证的实现
当分布式系统的各个组件连接到系统时,身份认证引导系统的组件通过一种安全方式来识别各个组件.所有的组件使用同样的身份认证机制.
身份认证是怎样工作的
当一个组件初始化连接到分布式系统,SecurityManager.authenticate方法就会被调用.这个组件提供它的证书以参数的方式传给authenticate方法.假设这个证书有两个属性:security-username和security-password。authenticate方法预期要么返回一个身份对象,要么抛出AuthenticationFailedException异常。
一个设计良好的authenticate方法会获得用户密码的方法以便比对证书。
Server是怎样生成证书的
为了连接有身份验证的locator进行连接,server端需要设置其证书。证书有两个属性:security-username和security-password.这里有两种方法来完成:
- server启动的时候会读取gfsecurity.properties文件,读取里面的security-username和security-password.例如
security-username=admin
security-password=xyz1234
用户名和密码都是以明文形式存储,所有gfsecurity.properties文件被系统权限严格限制.
- 为server实现AuthInitialize接口的getCredentials方法.这个回调方法的位置在security-peer-auth-init属性中定义.如
security-peer-auth-init=com.example.security.MyAuthInitialize
这个getCredentials方法的可能会从别的方式途径如数据库等资源中获得security-username和security-password属性.
Gateway发送者和接受者作为他们服务端的成员进行通信,因此,服务端证书就是gateway发送者和接受者见的证书.
缓存客户端怎样设置证书
为了链接有身份认证的locator或server,客户端也需要设置其证书.
- 为客户端实现AuthInitialize接口的getCredentials方法.这个回调定义在
security-client-auth-init
security-client-auth-init=com.example.security.ClientAuthInitialize
这个getCredentials方法的可能会从别的方式途径如数据库等资源中获得security-username和security-password属性.或者提示输入获得值.
其他组件怎样设置证书
gfsh在调用gfsh connect命令时提示输入用户名密码.
Pulse在启动时提示输入用户名密码;
由于REST API是无状态的,web应用或其他组件通过REST API与server或者locator对话时通过彼此间的身份验证.请求的头部需要包含security-username和security-password的属性.
实现SecurityManager接口
完成一下步骤来实现对locator或server的身份认证.
- 选择一种身份认证算法.在身份认证例子中存储了用户名密码对来代表所有连接进系统的组件.这种简化的算法会在用户名和密码通过了authenticate方法的情况下返回用户名作为身份标志.
- 定义security-manager属性.详见通过定义属性开启安全机制一节.
- 实现securityManager接口的authenticate方法
- 定义实现了身份认证算法需要的外部的资源.