`
农村外出务工男JAVA
  • 浏览: 104736 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

zookeeper权限控制实战

阅读更多

一:Zookeeper权限控制

    在zk集群中,不同的应用之间一般不会存在共享数据,为了避免某一个数据被不同的进程修改,这就需要进行相应的权限控制。

二:ACL介绍

  Zookeeper使用ACL机制来实现权限的控制,ACL机制主要分为3个方面,权限模式,权限ID和权限

  2.1 权限模式

   1)IP

     ip模式是指权限针对这个ip而设置的,比如"ip:192.168.0.00",即允许这个ip方法数据节点

   2)digest

   digest模式是最常用的一种模式,形如"username:password"的方式。设置成digest模式后,zk会使用如下的方式进行加密 

 public static void main(String[] args) {
		try {
			System.out.println(DigestAuthenticationProvider.generateDigest("tanjie:123"));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

  结果:

   tanjie:Q7FWxEJF7trsn2KKyWNOf1yqbKs=

  3)World

   World模式其实是一种开放的模式,即对所以用户开放,设置格式是"world:anyone",事实上这种模式没什么效果,因为设置了也对所有人开放

   4)Super

   Super模式是超级管理员模式,超级管理员可以对任何节点进行操作,想象一下,如果创建某个持久节点的进程已经不再使用了,那这个持久的节点该怎么处理呢,这就需要

   使用超级管理员模式了

   要使用超级管理员模式,需要在zk的启动脚本zkServer.sh里面配置一下,可以配置形如"super:password",其中super是用户名,password是密码,这个可以根据需要随便设置

   配置完成后,然后重启zkServer即可,然后在你的程序中,就可以以超级管理员的方法给zk客户端添加权限然后就可以访问任何节点了。

2.2 授权对象ID

    zk的授权对象是指将权限赋予谁,比如ip就是赋予一个ip地址,digest形式就是服务指定的用户名,super模式就是超级管理员,world默认就是anyone

2.3权限

    权限就是通过设置被允许的操作,常见的就是CRUD和ADMIN

三:举例说明

   通过上面的介绍,大家已经对zk的ACL权限是如何控制对节点数据的访问,下面通过一些例子来加深认识

    例一:不同的客户端去获取设置了权限的同一个节点的数据


import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

import com.zookeeper.utils.CommonParams;


public class Zookeeper_Acl_Create  extends CommonParams implements Watcher {

	private static CountDownLatch latch = new CountDownLatch(1);
	
	private static CountDownLatch countDownLatch = new CountDownLatch(1);
	
	private static ZooKeeper zk = null;

	public void syncInit() {
		try {
			zk = new ZooKeeper(CONNECTION_IP, 5000,
					new Zookeeper_Acl_Create());
			latch.await();
			zk.addAuthInfo("digest", "username:password".getBytes());
			zk.create("/act", "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);
			ZooKeeper zk3 =  new ZooKeeper(CONNECTION_IP, 5000,
					null);
			zk3.addAuthInfo("digest", "username:password".getBytes());
			String value2 = new String(zk3.getData("/act", false, null));
			System.out.println("zk3有权限进行数据的获取" + value2);
			ZooKeeper zk2 =  new ZooKeeper(CONNECTION_IP, 5000,
					null);
			zk2.addAuthInfo("digest", "super:123".getBytes());
			zk2.getData("/act", false, null);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (KeeperException e) {
			System.out.println("异常:" + e.getMessage());
			System.out.println("zk2没有权限进行数据的获取");
			countDownLatch.countDown();
		}
	}

	@Override
	public void process(WatchedEvent event) {
		if (KeeperState.SyncConnected == event.getState()) {
			if (event.getType() == EventType.None && null == event.getPath()) {
				latch.countDown();
			} 
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Zookeeper_Acl_Create acl_Create = new Zookeeper_Acl_Create();
		acl_Create.syncInit();
		countDownLatch.await();
	}

}

   运行结果如下:

zk3有权限进行数据的获取init
异常:KeeperErrorCode = NoAuth for /act
zk2没有权限进行数据的获取

     可以看到,路径"/act"我们使用digest模式添加了权限,zk3使用正确的用户名密码进行节点访问可以获取到节点数据,但是zk2使用了错误的权限,zk就会报错

例二:删除节点权限特殊说明

  对于节点的删除,如果一个节点存在其子节点,需要注意的是,权限是不能被继承的.看下面的程序:


import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

/**
 * 对一个节点添加权限后,作用范围是其子节点,
 * 
 * @author tanjie
 *
 */
public final class Zookeeper_Acl_delete implements Watcher {

	private static CountDownLatch latch = new CountDownLatch(1);
	
	private static CountDownLatch countDownLatch = new CountDownLatch(1);

	private static ZooKeeper zk = null;

	private static ZooKeeper zk2 = null;

	private static ZooKeeper zk3 = null;

	private static ZooKeeper zk4 = null;

	final static String PATH = "/acl-delete";

	final static String PATH2 = "/acl-delete/child";

	public static void syncInit() {
		try {
			zk = new ZooKeeper("host:2181", 5000,
					new Zookeeper_Acl_delete());
			latch.await();
			zk.addAuthInfo("digest", "true".getBytes());
			zk.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL,
					CreateMode.PERSISTENT);
			zk.create(PATH2, "init".getBytes(), Ids.CREATOR_ALL_ACL,
					CreateMode.EPHEMERAL);
			zk2 = new ZooKeeper("192.168.8.88:2181", 5000,
					null);
			try{
				zk2.delete(PATH2, -1);
			}catch(Exception e){
				System.out.println("异常:" + e.getMessage());
			}
			zk3 = new ZooKeeper("host:2181", 5000,
					null);
			zk3.addAuthInfo("digest", "true".getBytes());
			zk3.delete(PATH2, -1);
			System.out.println("删除节点成功:" + PATH2);
			zk4 = new ZooKeeper("host:2181", 5000,
					null);
			zk4.delete(PATH, -1);
			System.out.println("删除节点成功:" + PATH);
			countDownLatch.countDown();
		} catch (Exception e) {
			System.out.println("异常:" + e.getMessage());
		}
	}

	@Override
	public void process(WatchedEvent event) {
		if (KeeperState.SyncConnected == event.getState()) {
			if (event.getType() == EventType.None && null == event.getPath()) {
				latch.countDown();
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		syncInit();
		countDownLatch.await();
	}
}

  运行结果如下:

异常:KeeperErrorCode = NoAuth for /acl-delete/child
删除节点成功:/acl-delete/child
删除节点成功:/acl-delete

   可以看到,第一次我们使用无权限的zk2去删除,显然会报错,第二次我们使用带权限的zk3去操作,子节点被删除成功,但是当我们使用zk4去执行删除操作的时候并没有指定任何权限,依然能够删除其父节点,说明zk在进行删除操作的时候,其权限的作用范围是其子节点。也就是说,当我们对一个节点添加了权限之后我们依然可以随意删除该节点但是对于这个节点的子节点,就必须拥有相应的权限才能删除。而且zk原生api不支持递归删除,即在存在子节点的情况下,不允许删除其父节点。

1
1
分享到:
评论

相关推荐

    Hbase+Spring boot实战分布式文件存储

    实战开发通过jmx获取HBase运行时数据,监控集群状态 5-1 HBase备份与恢复 5-2 HBase监控简介 5-3 Hadoop JMX监控实战 5-4 HBase JMX监控实战 第6章 Phoenix & Sqoop 对HBase业务应用过程中常用到的第三方开源工具...

    Hadoop实战中文版

    Hive及Hadoop群 11.1 Hive 11.1.1 安装与配置Hive 11.1.2 查询的示例 11.1.3 深入HiveQL 11.1.4 Hive小结 11.2 其他Hadoop 相关的部分 11.2.1 HBase 11.2.2 ZooKeeper 11.2.3 Cascading 11.2.4 Cloudera ...

    全新JAVAEE大神完美就业实战课程 超150G巨制课程轻松实战JAVAEE课程 就业部分.txt

    2Zookeeper集群 2品优购电商系统部署 3SolrCloud集群 4RedisCluster集群 5开源数据库中间件-MyCat 6Nginx的安装与启动 7Nginx静态网站部署 8Nginx反向代理与负载均衡 9品优购部署方案 10Docker简介 11...

    springboot2.0企业中台实战之权限统一管理与应用统一授权 (dubbo分布式系统实战)

    故而本门课程的“代码实战”是建立在之前debug录制的“企业权限管理平台”这套课程的基础之上的,故而在这里debug建议没有项目开发基础的小伙伴可以先去学习我的那套“企业权限管理平台”的实战课程,之后再来学习我...

    Hadoop实战中文版.PDF

    1387.4 以数据库作为输入输出 1437.5 保持输出的顺序 1457.6 小结 146第8章 管理Hadoop 1478.1 为实际应用设置特定参数值 1478.2 系统体检 1498.3 权限设置 1518.4 配额管理 1518.5 启用回收站 ...

    Hadoop实战(陆嘉恒)译

    细则手册7.1 向任务传递作业定制的参数7.2 探查任务特定信息7.3 划分为多个输出文件7.4 以数据库作为输入输出7.5 保持输出的顺序7.6 小结第8 章 管理Hadoop8.1 为实际应用设置特定参数值8.2 系统体检8.3 权限设置8.4...

    spring boot demo 是一个用来深度学习并实战 spring boot 的项目

    该项目已成功集成 actuator(监控)、admin(可视化监控)、...job(分布式定时任务)、swagger(API接口管理测试)、security(基于RBAC的动态权限认证)、SpringSession(Session共享)、Zookeeper(结合AOP实现分布式锁)、Ra

    2019品优购.txt

    jms 负载均衡:nginx 搜索:solr集群(solrCloud),配合zookeeper搭建, 使用spring-data-solor 缓存:redis集群,使用spring-data-redis 图片存储:fastDFS集群 网页静态化:freemarker 单点登录:cas 权限管理:...

    Hadoop实战

    1357.2 探查任务特定信息 1377.3 划分为多个输出文件 1387.4 以数据库作为输入输出 1437.5 保持输出的顺序 1457.6 小结 146第8章 管理Hadoop 1478.1 为实际应用设置特定参数值 1478.2 系统体检 1498.3 权限设置 1518...

    java8源码-JavaInterview:Java面试

    权限控制(设计、shiro) Java学习资源 截图 Java书籍推荐 实战项目推荐 小心翼翼的告诉你,上面的资源当中就有很多企业级项目,没有项目一点不用怕,因为你看到了这个。 说明 JavaInterview介绍 目的很简单,写这些...

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015修改数据源 016常用 APT 命令 017Linux 用户和组管理 018查看目录和文件的权限 019更改...

    Java微服务架构163课

    008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015修改数据源 016常用 APT 命令 017Linux 用户和组管理 018查看目录和文件的权限...

    单点登录源码

    本系统是基于RBAC授权和基于用户授权的细粒度权限控制通用平台,并提供单点登录、会话管理和日志管理。接入的系统可自由定义组织、角色、权限、资源等。用户权限=所拥有角色权限合集+用户加权限-用户减权限,优先级...

    java8源码-javaGuide:java面试整理

    ZooKeeper 数据通信/中间件 RPC 消息队列 权限认证 分布式 & 微服务 API 网关 网关主要用于请求转发、安全认证、协议转换、容灾。 配置中心 代办...... 唯一 id 生成 服务治理:服务注册与发现、服务路由控制 代办.....

    java8源码-javaGuide:【Java学习】一份涵盖大部分Java程序员所需要掌握的核心知识。https://javaguide.cn

    ZooKeeper 数据通信/中间件 RPC 消息队列 权限认证 分布式 & 微服务 API 网关 网关主要用于请求转发、安全认证、协议转换、容灾。 配置中心 代办...... 唯一 id 生成 服务治理:服务注册与发现、服务路由控制 代办.....

    spring-boot-demo_xkcoding.tar.gz

    job(分布式定时任务)、swagger(API接口管理测试)、security(基于RBAC的动态权限认证)、SpringSession(Session共享)、Zookeeper(结合AOP实现分布式锁)、RabbitMQ(消息队列)、Kafka(消息队列)、websocket(服务端推送...

    spring boot集成demo大全.zip

    job(`分布式定时任务`)、swagger(`API接口管理测试`)、security(`基于RBAC的动态权限认证`)、SpringSession(`Session共享`)、Zookeeper(`结合AOP实现分布式锁`)、RabbitMQ(`消息队列`)、Kafka(`消息队列`)、...

    「大数据干货」基于Hadoop的大数据平台实施——整体架构设计.pdf

    需要⼤数 据的可以加我扣扣群⼤数据零基础到项⽬实战,专注⼤数据分析⽅法,⼤数据编程,⼤数据仓库,⼤数据案例,⼈⼯智能,数据挖掘都是纯⼲ 货分享,进群获取永久免费权限410391744 第⼀记,⼤数据平台的整体架构...

Global site tag (gtag.js) - Google Analytics