zoukankan      html  css  js  c++  java
  • PrestoSPI安全扩展

    由于Presto官方文档和谷歌搜索都没有相关的内容,git项目中也没有支持sentry的安全插件扩展,因此只能从源码中寻找答案,在梳理完SPI包的安全相关源码结构后,已实现了一个自定义的安全插件,经验证可正常使用

    简要总结如下:

    扩展系统级权限SAC

    系统级权限是对Presto支持的所有数据源都有效的,在实际判断一个sql操作的权限时,要先过系统级权限这一关

    一、基本流程

    1、实现com.facebook.presto.spi.security.SystemAccessControl接口或直接继承已有的实现类

    (1)定义NAME是一个唯一的字符串,便于在etc/access-control.properties的access-control.name指定

    (2)实现各种方法

    2、在com.facebook.presto.security.AccessControlManager的AccessControlManager()方法加上:

    addSystemAccessControlFactory(new AllowSpecifiedSystemAccessControl.Factory());

    3、打包presto-main模块并替换lib目录下的presto-main jar包

    扩展数据源级权限CAC

    数据源权限是对于某个数据源有效的,系统级权限放行后,可以针对某个数据源做一些差异化的权限控制

    一、基本流程

    1、实现com.facebook.presto.spi.connector.ConnectorAccessControl接口或直接继承已有的实现类

           实现各种方法

    2、再写一个对应的实现了Module接口的包装类,configure()方法

    binder.bind(ConnectorAccessControl.class).to(AllowSpecifiedAccessControl.class).in(Scopes.SINGLETON);

    3、再在想要扩展的数据源内添加相关配置以关联上新的扩展类

    如hive-hadoop2

    在com.facebook.presto.hive.security.HiveSecurityModuler的setup()方法加上

    bindSecurityModule("allow-specified", new AllowSpecifiedAccessControlModule());

    4、打包并替换

    1和2步骤修改的是presto-plugin-toolkit模块,3步骤修改的是presto-hive模块

    打包后替换后所要修改数据源如plugin/hive-hadoop2/目录下的jar包

    二、自定义配置

    以hive catalog为例,在etc/catalog/hive.properties新增如下属性

    security.user 用户名

    security.db 数据库的列表,以逗号分开

    在presto-plugin-toolkit模块com.facebook.presto.plugin.base.security包

    1、额外新增一个config pojo类

    @NotNull注解表示此属性不可为空,@Config(属性名)表示set方法要赋这个属性的值

    2、修改control类

    新增一个可传入config对象的构造器,由@Inject修饰可接受注入

    新增两个属性从而接收注入的配置

    private final String user;
    private final String db;
     
    @Inject
    public AllowSpecifiedAccessControl(AllowSpecifiedAccessControlConfig config) {
        this.user = config.getUser();
        this.db = config.getDB();
    }

    3、修改module类

    新增一个@Inject、@Provides注解修饰的方法,使config对象可以注入到control类的构造器中

    重写configure方法,使用configBinder包装类增强Binder对象,可以绑定config配置到该module上

    @Override
    public void configure(Binder binder)
    {
        configBinder(binder).bindConfig(AllowSpecifiedAccessControlConfig.class);
    }
     
    @Inject
    @Provides
    public ConnectorAccessControl getConnectorAccessControl(AllowSpecifiedAccessControlConfig config)
    {
        return new AllowSpecifiedAccessControl(config);
    }
     
  • 相关阅读:
    SSM知识点与整合之Spring知识点(pom.xml需要依赖的jar或者plugin)
    Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十三集之Redis的单机版搭建】
    maven pom.xml(公司版)
    spring开发需要的配置文件
    Python socket编程之六:多窗口的应用
    subplot的应用
    Python socket编程之五:更新分时图
    Python序列的切片操作与技巧
    Python socket编程之四:模拟分时图
    NSNotificationCenter 注意
  • 原文地址:https://www.cnblogs.com/codetouse/p/12745848.html
Copyright © 2011-2022 走看看