首页 > 其他分享 >dremio NamespaceService 简单说明一

dremio NamespaceService 简单说明一

时间:2023-01-02 22:22:18浏览次数:43  
标签:userName dremio return namespace NamespaceService 简单 new identity

此处主要说明社区版dremio namspaceservice 包含的一个能力,我们如果自己扩展下就可以实现简单的部分权限管理

参加定义类图

如下如可以看出namspaceservice 提供的能力

 

 

一个额外的能力

  • 接口定义
 
  interface Factory {
    /**
     * Return a namespace service for a given user. Note that this is for usernames
     * and users only, if roles are to be supported, use #get(NamespaceIdentity) instead.
     *
     * @param userName a valid user name
     * @return a namespace service instance
     * @throws NullPointerException if {@code userName} is null
     * @throws IllegalArgumentException if {@code userName} is invalid
     */
    NamespaceService get(String userName);
   //  如果我们希望包含基于角色的控制就可以实现此,实际上就是属于用户的namespace,这样就可以控制用户能力的显示了,可以任务是一个namespace 的子集
    NamespaceService get(NamespaceIdentity identity);
  }

官方的实现

因为默认我们使用的社区版是不启动权限能力的,所以实现比较简单,每个用户获取的都是所有的

NamespaceService 权限部分的使用

实际上是通过查询上下文解决的,主要在CatalogImpl中,基于NamespaceService 创建属于用户的Namespace服务

 CatalogImpl(
      MetadataRequestOptions options,
      PluginRetriever pluginRetriever,
      CatalogServiceImpl.SourceModifier sourceModifier,
      OptionManager optionManager,
      NamespaceService systemNamespaceService,
      NamespaceService.Factory namespaceFactory,
      Orphanage orphanage,
      DatasetListingService datasetListingService,
      ViewCreatorFactory viewCreatorFactory,
      IdentityResolver identityResolver,
      VersionContextResolverImpl versionContextResolverImpl) {
    this.options = options;
    this.pluginRetriever = pluginRetriever;
    this.sourceModifier = sourceModifier;
    this.userName = options.getSchemaConfig().getUserName();
 
    this.optionManager = optionManager;
    this.systemNamespaceService = systemNamespaceService;
    this.namespaceFactory = namespaceFactory;
    this.orphanage = orphanage;
    this.datasetListingService = datasetListingService;
    this.viewCreatorFactory = viewCreatorFactory;
    this.identityResolver = identityResolver;
 
    final CatalogIdentity identity = options.getSchemaConfig().getAuthContext().getSubject();
    // 用户的Namespace服务
    this.userNamespaceService = namespaceFactory.get(identityResolver.toNamespaceIdentity(identity));
 
    this.versionContextResolverImpl = versionContextResolverImpl;
    this.datasets = new DatasetManager(pluginRetriever, userNamespaceService, optionManager, userName,
        identityResolver, versionContextResolverImpl);
    this.iscDelegate = new InformationSchemaCatalogImpl(userNamespaceService, pluginRetriever);
 
    this.selectedSources = ConcurrentHashMap.newKeySet();
    this.crossSourceSelectDisable = optionManager.getOption(CatalogOptions.DISABLE_CROSS_SOURCE_SELECT);
  }

identityResolver.toNamespaceIdentity解析处理

private class CatalogIdentityResolver implements IdentityResolver {
    @Override
    public CatalogIdentity getOwner(List<String> path) throws NamespaceException {
      NamespaceKey key = new NamespaceKey(path);
      if (systemNamespace.getEntityByPath(key).getType() == NameSpaceContainer.Type.DATASET) {
        final DatasetConfig dataset = systemNamespace.getDataset(key);
        return dataset.getType() != DatasetType.VIRTUAL_DATASET ? null : new CatalogUser(dataset.getOwner());
      }
      return null;
    }
 
    @Override
    public NamespaceIdentity toNamespaceIdentity(CatalogIdentity identity) {
      if (identity instanceof CatalogUser) {
        if (identity.getName().equals(SystemUser.SYSTEM_USERNAME)) {
          return new NamespaceUser(() -> SystemUser.SYSTEM_USER);
        }
 
        try {
          final User user = context.get().getUserService().getUser(identity.getName());
          return new NamespaceUser(() -> user);
        } catch (UserNotFoundException ignored) {
        }
      }
 
      return null;
    }
  }

dremio 社区版实现的NamespaceService

从以下可以看出,实际上是没有控制的,所以都是全部数据

 public static final class Factory implements NamespaceService.Factory {
    private final LegacyKVStoreProvider kvStoreProvider;
 
    @Inject
    public Factory(LegacyKVStoreProvider kvStoreProvider) {
      this.kvStoreProvider = kvStoreProvider;
    }
 
    @Override
    public NamespaceService get(String userName) {
      Preconditions.checkNotNull(userName, "requires userName"); // per method contract
      return new NamespaceServiceImpl(kvStoreProvider);
    }
 
    @Override
    public NamespaceService get(NamespaceIdentity identity) {
      Preconditions.checkNotNull(identity, "requires identity"); // per method contract
      return new NamespaceServiceImpl(kvStoreProvider);
    }
  }

说明

以上是一个简单的介绍,大家可以自己扩展下,实现一个简单的权限能力

参考资料

services/namespace/src/main/java/com/dremio/service/namespace/NamespaceService.java
services/namespace/src/main/java/com/dremio/service/namespace/NamespaceServiceImpl.java
sabot/kernel/src/main/java/com/dremio/exec/catalog/CatalogImpl.java

标签:userName,dremio,return,namespace,NamespaceService,简单,new,identity
From: https://www.cnblogs.com/rongfengliang/p/17020718.html

相关文章

  • dremio 的加速文件系统插件简单说明
    dremio包含一个强大的功能就是反射加速,dremio为了对于反射数据的存储开发了自己的文件系统插件插件类图  parquet以及iceberg的支持从start入口可以看出包含......
  • c#基于socket编程实现简单多人聊天程序
    首先直接上代码链接,欢迎修改与指正:​​https://github.com/yinyoupoet/chatRoomTest​​​代码、可运行程序、详细设计文档、使用说明等都在里面啦然后再上图你们感受下:......
  • 网络的,简单两步一样实现命令行对话,不需要社交软件也可以聊天,基础知识(一)
    网络的,简单两步一样实现命令行对话,不需要社交软件也可以聊天,基础知识(一)。一、准备工作1)首先准备一下NC,关于NC这里没什么好说的,网络届的瑞士军刀。这里准备了以往的经典......
  • dremio ClassPathScanner 简单说明
    ClassPathScanner实际上是dremio基于配置+约定的类扫描处理,为了性能同时使用了开源的reflections工具包约定主要扫描包含以下约定key的类或者包/**Confi......
  • JavaScript 简单类型与复杂类型
    JavaScript简单类型与复杂类型目录JavaScript简单类型与复杂类型1.简单类型与复杂类型2.堆和栈3.简单类型的内存分配4.复杂类型的内存分配5.简单类型传参6.复杂类......
  • certbot简单使用
    ssl一直用的是阿里的免费证书,但是每年需要定时更换证书,而且数量上也有限制,这就很烦,我这么懒,别说一年一换,就是两年一换证书我都懒得打开后台~科普为了加快推广https的普......
  • 简单指针实现两个数比较大小
    我们要先知道指针变量的作用是储存你指定变量所在的地址。因为按照计算机规则你所定义的值会被电脑储存在一个位置,只要是位置就会有地址。#include<stdio.h>intmain(){in......
  • 数字三角形 —— java蓝桥杯(简单)
    题目描述上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每......
  • 使用awk和grep做简单的统计
    grep或egrep或awk过滤两个或多个关键词: grep-E‘123|abc’filename//找出文件(filename)中包含123或者包含abc的行 egrep‘123|abc’filename//用egrep同样可......
  • 简单谈谈我眼中的程序
    普通用户看来,程序就是他们能看到的用户界面,比如电脑里面装的软件,手机上装的app,浏览器能打开的网页。但是,这只是一个程序的一小部分。程序最重要的是数据,用户感知最强ui,在......