美文网首页
presto的权限管控

presto的权限管控

作者: 后知不觉1 | 来源:发表于2022-07-11 21:47 被阅读0次

1、 presto的插件

因为自定义鉴权也相当于是一个插件,所以要先介绍插件写法

1.1、presto的插件引入

presto将所有的插件都通过一个接口类暴露使用到spi技术,能够将所有的插件入口统一

  <dependency>
        <groupId>com.facebook.presto</groupId>
        <artifactId>presto-spi</artifactId>
        <version>0.245</version>
        <scope>provided</scope>
    </dependency>

1.2、spi配置文件描述

创建META-INF.services目录及文件
名称: com.facebook.presto.spi.Plugin
内容:自定义插件实现类的类名
demo:com.presto.plugin.PrivilegePlugin

image.png

2、权限控制插件写法

2.1、入口类

由spi定义权限控制插件入口类,必须实现getSystemAccessControlFactories方法以com.presto.plugin.PrivilegePlugin为例

  public class PrivilegePlugin implements Plugin
  {
      @Override
      public Iterable<SystemAccessControlFactory> getSystemAccessControlFactories()
      {
          return ImmutableList.<SystemAccessControlFactory>builder()
                  .add(new ReadOnlyRangerSystemAccessControl.Factory())
                  .build();
      }

  }

2.2、SystemAccessControlFactory实现类

  public interface SystemAccessControlFactory {
      String getName();  #返回自定义名称,用来配置文件指定鉴权实现类,名称要唯一

      SystemAccessControl create(Map<String, String> config);  #需要返回SystemAccessControl 实现类的实例
  }

2.3、SystemAccessControl类的实现

实现类中重写一下方法,如果不报错即代表有权限。后面的鉴权逻辑可以通过restful服务,也可以通过ranger 服务

  public interface SystemAccessControl {
   void checkCanSetUser(AccessControlContext context, Optional<Principal> principal, String userName);

   void checkQueryIntegrity(Identity identity, AccessControlContext context, String query);

   void checkCanSetSystemSessionProperty(Identity identity, AccessControlContext context, String propertyName);

   default void checkCanAccessCatalog(Identity identity, AccessControlContext context, String catalogName) {
       AccessDeniedException.denyCatalogAccess(catalogName);
   }

   default Set<String> filterCatalogs(Identity identity, AccessControlContext context, Set<String> catalogs) {
       return Collections.emptySet();
   }

   default void checkCanCreateSchema(Identity identity, AccessControlContext context, CatalogSchemaName schema) {
       AccessDeniedException.denyCreateSchema(schema.toString());
   }

   default void checkCanDropSchema(Identity identity, AccessControlContext context, CatalogSchemaName schema) {
       AccessDeniedException.denyDropSchema(schema.toString());
   }

   default void checkCanRenameSchema(Identity identity, AccessControlContext context, CatalogSchemaName schema, String newSchemaName) {
       AccessDeniedException.denyRenameSchema(schema.toString(), newSchemaName);
   }

   default void checkCanShowSchemas(Identity identity, AccessControlContext context, String catalogName) {
       AccessDeniedException.denyShowSchemas();
   }

   default Set<String> filterSchemas(Identity identity, AccessControlContext context, String catalogName, Set<String> schemaNames) {
       return Collections.emptySet();
   }

   default void checkCanCreateTable(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyCreateTable(table.toString());
   }

   default void checkCanDropTable(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyDropTable(table.toString());
   }

   default void checkCanRenameTable(Identity identity, AccessControlContext context, CatalogSchemaTableName table, CatalogSchemaTableName newTable) {
       AccessDeniedException.denyRenameTable(table.toString(), newTable.toString());
   }

   default void checkCanShowTablesMetadata(Identity identity, AccessControlContext context, CatalogSchemaName schema) {
       AccessDeniedException.denyShowTablesMetadata(schema.toString());
   }

   default Set<SchemaTableName> filterTables(Identity identity, AccessControlContext context, String catalogName, Set<SchemaTableName> tableNames) {
       return Collections.emptySet();
   }

   default void checkCanAddColumn(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyAddColumn(table.toString());
   }

   default void checkCanDropColumn(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyDropColumn(table.toString());
   }

   default void checkCanRenameColumn(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyRenameColumn(table.toString());
   }

   default void checkCanSelectFromColumns(Identity identity, AccessControlContext context, CatalogSchemaTableName table, Set<String> columns) {
       AccessDeniedException.denySelectColumns(table.toString(), columns);
   }

   default void checkCanInsertIntoTable(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyInsertTable(table.toString());
   }

   default void checkCanDeleteFromTable(Identity identity, AccessControlContext context, CatalogSchemaTableName table) {
       AccessDeniedException.denyDeleteTable(table.toString());
   }

   default void checkCanCreateView(Identity identity, AccessControlContext context, CatalogSchemaTableName view) {
       AccessDeniedException.denyCreateView(view.toString());
   }

   default void checkCanDropView(Identity identity, AccessControlContext context, CatalogSchemaTableName view) {
       AccessDeniedException.denyDropView(view.toString());
   }

   default void checkCanCreateViewWithSelectFromColumns(Identity identity, AccessControlContext context, CatalogSchemaTableName table, Set<String> columns) {
       AccessDeniedException.denyCreateViewWithSelect(table.toString(), identity);
   }

   default void checkCanSetCatalogSessionProperty(Identity identity, AccessControlContext context, String catalogName, String propertyName) {
       AccessDeniedException.denySetCatalogSessionProperty(propertyName);
   }

   default void checkCanGrantTablePrivilege(Identity identity, AccessControlContext context, Privilege privilege, CatalogSchemaTableName table, PrestoPrincipal grantee, boolean withGrantOption) {
       AccessDeniedException.denyGrantTablePrivilege(privilege.toString(), table.toString());
   }

   default void checkCanRevokeTablePrivilege(Identity identity, AccessControlContext context, Privilege privilege, CatalogSchemaTableName table, PrestoPrincipal revokee, boolean grantOptionFor) {
       AccessDeniedException.denyRevokeTablePrivilege(privilege.toString(), table.toString());
   }
  }

3、安装

3.1、配置文件

在$PRESTO_HOME/etc/目录创建access-control.properties
内容: access-control.name=tianzehao

备注: 这里的名称有SystemAccessControlFactory 的实现返回,属于自定义的

3.2、打包插件上传

默认插件位置为 $PRESTO_HOME/plugins,可以自定义catalog.config-dir,重新启动presto

相关文章

  • presto的权限管控

    1、 presto的插件 因为自定义鉴权也相当于是一个插件,所以要先介绍插件写法 1.1、presto的插件引入 ...

  • JeeSite | 访问控制权限

    在各种后台系统中都会涉及到权限的管控,从功能权限的管控,到数据权限的管控,都是为了让系统的在使用的过程中更加的安全...

  • vsphere如何利用权限实现行为管控

    如何利用权限实现行为管控 如何利用权限实现行为管控 1 vsphere 中权限总览1.1 角色1.2 用户/用户组...

  • gitlab用户,组,项目权限管控

    前言:gitlab上的权限管控是非常重要的,尤其是很多研发人员开发一个项目。这个是我总结的权限管控。 1.这个是创...

  • 大工业

    行业特点: 成本管控 成本分析 公司架构:规模大小 业务布局 管理与分工 权限 核算与科目 成本管控 成本分...

  • 数据库平台规划

    数据库平台能力 补充:安全管控权限申请→权限审核→权限下放→权限回收 数据库集中管理 业务需求→产品&版本&网段服...

  • spring security 访问403 Forbidden

    spring security 配置了访问权限管控 然后前端登陆,访问需要权限的地址时出现 403 Forbidd...

  • gitlab角色权限管控策略

    gitlab角色权限管控策略 Gitlab用户在组中有五种角色及权限: Guest:访客,可以创建issue、发表...

  • SpringBoot+Shiro 配置

    shiro是一款轻量级的RBAC权限框架,主要使用于权限管控。本文主要介绍shiro与SpringBoot集成的基...

  • ElasticSearch结合LDAP实现权限、用户管控

    项目背景使用ElasticSearch实现数据宽表,处理热交互数据,需要实现权限管控等功能,权限粒度要求精确到列。...

网友评论

      本文标题:presto的权限管控

      本文链接:https://www.haomeiwen.com/subject/kcnnbrtx.html