由于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);
} |