Zookeeper的安全认证,在于其ACL(Access Control List)。Zookeeper提供了三种权限控制机制:权限模式、授权对象、权限;

权限模式:Scheme,一般使用如下四种权限模式;

       IP:IP模式通过IP地址粒度来进行控制权限。当然,也支持网段分配;

       Digest:最常用的权限控制模式,类似于“username:password”形式的权限标识进行权限配置。Zookeeper对形成的权限标识先后进行两次编码处理:SHA-1加密算法、Base64编码;

       World:一种最开放的权限控制模式,仅仅使用一个标识;

       Super:超级用户模式,在超级用户模式下可以对Zookeeper进行任意操作;

权限对象:指权限赋予的用户或一个指定的实体,在不同模式下,授权对象也是不同的。这种模式和授权对象一一对应;

权限:指通过权限检测后可以被允许执行的操作,Zookeeper对数据的操作权限分为五大类:CREATE、DELETE、READ、WRITE、ADMIN;

下面以Digest为例,跑一段代码看一下效果:

public class ZookeeperAuth2{
	//连接地址
	private static final String CONNECTION_ADDR = "192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181";	
	//测试路径
	private static final String NODE_PATH = "/testAuth";
	//认证类型
	private static final String AUTH_TYPE = "digest";
	//正确的认证
	private static final String AUTH_VALUE = "20190112";
	//错误的认证
	private static final String AUTH_BAD_VALUE = "20180112";
	public static void main(String[] args) {
	     try {
	    	//一、创建节点
		    ZooKeeper zk=new ZooKeeper(CONNECTION_ADDR,5000,new Watcher() {
					public void process(WatchedEvent event) {
					}
			     });
		    zk.addAuthInfo(AUTH_TYPE,AUTH_VALUE.getBytes());
			zk.create(NODE_PATH,"买女孩的小火柴".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
	    } catch (Exception e) {
			System.err.println("节点创建失败,原因:" + e.getMessage());
		}
	     
		try {	
	        //二、无授权信息访问
	       ZooKeeper zk2=new ZooKeeper(CONNECTION_ADDR,5000,new Watcher() {
					public void process(WatchedEvent event) {
					}
			     });
	       System.out.println("无授权信息访问,获取数据为:" + new String(zk2.getData(NODE_PATH,false,null)));
		} catch (Exception e) {
			System.err.println("无授权信息访问失败,原因:" + e.getMessage());
		}
		try {	
	        //三、使用错误信息访问结点
	        ZooKeeper zk3=new ZooKeeper(CONNECTION_ADDR,5000,new Watcher() {
							public void process(WatchedEvent event) {
							}
					     });
	        zk3.addAuthInfo(AUTH_TYPE,AUTH_BAD_VALUE.getBytes());
	        System.out.println("使用错误信息访问结点,获取数据为:" + new String(zk3.getData(NODE_PATH,false,null)));
		} catch (Exception e) {
			System.err.println("使用错误信息访问结点失败,原因:" + e.getMessage());
		}  
	   try {	
	        //四、使用正确信息访问结点
	        ZooKeeper zk4=new ZooKeeper(CONNECTION_ADDR,5000,new Watcher() {
							public void process(WatchedEvent event) {
							}
					     });
	        zk4.addAuthInfo(AUTH_TYPE,AUTH_VALUE.getBytes());
	        System.out.println("使用正确信息访问结点,获取数据为:" + new String(zk4.getData(NODE_PATH,false,null)));
	        
		} catch (Exception e) {
			System.err.println("使用正确信息访问结点失败,原因:" + e.getMessage());
		}
	}

}

运行效果如图:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐