MLSQL编译时权限控制示例详解

前言

关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界。

权限控制,对于MLSQL而言的重要程度可以说是生命线。 MLSQL需要面对各式各样的资源访问,比如MySQL, Oracle,HDFS,Hive,Kafka,Sorl,ElasticSearch,Redis,API,Web等等,不同用户对这些数据源(以及表,列)的权限是不一样的。

传统模式是,每个用户都需要有个proxy user,然后到每个数据源里面给这个proxy user进行授权。 这看起来似乎就是麻烦点,但是在实际操作中,基本是很难执行的,不同的数据源在不同的团队里面,那么整个申请流程可能要天甚至周计了。
如果上面的问题已经让人气馁,那么对于采用Hive做数仓的公司,可能对HIve权限访问更让人绝望。Hive的授权模式是跟着Linux用户走的,也就是Spark启动用户是谁,谁就有权限访问,这个对于多租户的MLSQL应用来说,则是完全不可行了,比如启动Spark的是sparkUser,但是真正执行的人,其实可能是张三,李四等等。Hive就无法知道是具体哪个人完成的,只知道是sparkUser。

还有一个大家可能感慨的点:

我们好不容易写了个脚本,跑了一个小时,突然脚本失败,一看,第350行那里访问的数据源权限不足。 这可真是让人恼火。

问题来了

那么,怎么才能在脚本运行前,就知道脚本里涉及到的资源是不是都被授权了?

答案是:有

题外话:标题不严谨,因为MLSQL本质是个解释性执行语言,不需要编译,更好的标题是 【解析时权限控制】。

MLSQL如果开启了权限验证,他会先扫描整个脚本,然后提取必要的信息,这些信息就包含了各种数据源的详细信息,从而在运行前就可以知道你是不是访问了未经授权的库表。那么MLSQL是怎么做到的呢?我们来看下面的信息:

connect jdbc where
driver="com.mysql.jdbc.Driver"
and url="jdbc:mysql://${ip}:${host}/db1?${MYSQL_URL_PARAMS}"
and user="${user}"
and password="${password}"
as db1_ref;

load jdbc.`db1_ref .people`
as people;

save append people as jdbc.`db1_ref.spam` ;

因为MLSQL要求任何数据源,都需要使用load语句进行加载,在解析load语句时,MLSQL知道,用户现在要访问的是基于JDBC协议的数据源访问,他通过url拿到了这些信息:

db: db1
table: people
operateType: load
sourceType: mysql
tableType: JDBC

当然,这个脚本用户还会写入一张spam表,也一样会被提取信息:

db: db1
table: people
operateType: save
sourceType: mysql
tableType: JDBC

然后还有一张临时表people,所以这个脚本总共有三张表信息,之后这些信息会被发送到AuthCenter里进行判断,AuthCenter会告诉MLSQL那张表是没有对当前用户授权的,如果发现未经授权的表,MLSQL会直接抛出异常。整个过程中,完全不会执行任何物理计划,只是对脚本的信息抽取。

在MLSQL中,我们不能在select语句里访问hive表,只能通过load语句加载,比如下面的句子会报错:

select * from public.abc as table1;

我们无权在select语句中访问public.abc库,如果需要使用,你可以通过如下方式完成:

load hive.`public.abc ` as abc;
select * from abc as table1;

如何实现列级别控制

MLSQL在解析load语句的时候,会询问当前用户访问的表,有哪些列是被授权的,然后会改写最后load的语句,提供一个新的视图,该视图只有用户被授权的列。

总结

MLSQL通过一些有效的限制,可以在语法解析层面直接提取了所有数据源相关信息,并且将其发送给到配套的权限中心进行判断,避免在运行时发现授权拒绝问题。MLSQL此举意义重大,使得MLSQL系统不再完全依赖于底层系统的权限控制,从而让问题得到了极大的简化。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • MySQL数据库远程访问权限如何打开(两种方法)

    下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads » 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "

  • centos下编译安装mysql报错解决方案

    今天在centos6.2下面源码编译安装mysql的时,在编译mysql的时候报了一个蛋蛋的错误: 复制代码 代码如下: [root@vps870 mysql-5.5.28]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ > -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ > -DDEFAULT_CHARSET=gbk \ > -DDEFAULT_COLLATION=gbk_chinese_ci \ > -

  • MySQL创建用户与授权及撤销用户权限方法

    MySQL中创建用户与授权的实现方法. 运行环境:widnows xp professional + MySQL5.0 一, 创建用户 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,

  • mysql 新增、删除用户和权限分配

    1. 新增用户 复制代码 代码如下: mysql>insert into mysql.user(Host,User,Password) values("localhost","lionbule",password("hello1234"));mysql>flush privileges; 2. 修改用户密码 复制代码 代码如下: mysql>update mysql.user set password=password('new

  • MySQL数据库设置远程访问权限方法小结

    MySQL基础知识第一期,如何远程访问MySQL数据库设置权限方法总结,讨论访问单个数据库,全部数据库,指定用户访问,设置访问密码,指定访问主机. 1,设置访问单个数据库权限 复制代码 代码如下: mysql>grant all privileges on test.* to 'root'@'%'; 说明:设置用户名为root,密码为空,可访问数据库test 2,设置访问全部数据库权限 复制代码 代码如下: mysql>grant all privileges on *.* to 'root'

  • CentOS MySQL 5.7编译安装步骤详细说明

    CentOS MySQL 5.7编译安装 MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化,每秒100W QPS已不再是MySQL的追求,下个版本能否上200W QPS才是吾等用户更关心的 更好的InnoDB存储引擎 更为健壮的复制功能:复制带来了数据完全不丢失的方案,传统金融客户也可以选择使用MySQL数据库.此外,GTID在线平滑升级也变得可

  • Linux下编译安装Mysql 5.5的简单步骤

    首先是安装cmake环境.因为博主测试机是ubuntu,所以直接用apt-get install cmake命令来安装,yum相信应该也一样.或者可以编译安装,步骤如下. 复制代码 代码如下: wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz tarx zvfc cmake-2.8.12.2.tar.gz cd cmake-2.8.12.2  ./configure make && make install 安装完成后执行

  • MYSQL设置触发器权限问题的解决方法

    本文实例讲述了MYSQL设置触发器权限的方法,针对权限错误的情况非常实用.具体分析如下: mysql导入数据提示没有SUPER Privilege权限处理,如下所示: ERROR 1419 (HY000): You do not have the SUPER Privilege and Binary Logging is Enabled 导入function . trigger 到 MySQL database,报错: You do not have the SUPER privilege an

  • MLSQL编译时权限控制示例详解

    前言 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界. 权限控制,对于MLSQL而言的重要程度可以说是生命线. MLSQL需要面对各式各样的资源访问,比如MySQL, Oracle,HDFS,Hive,Kafka,Sorl,ElasticSearch,Redis,API,Web等等,不同用户对这些数据源(以及表,列)的权限是不一样的. 传统模式是,每个用户都需要有个proxy user,然后到每个数据源里面给这个proxy user进行授权. 这看起来似乎就是麻

  • 如何优雅地在vue中添加权限控制示例详解

    前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需要进行权限控制. 第一个是侧边菜单栏,需要控制显示与隐藏. 第二个就是页面内的各个按钮,弹窗等. 流程 1.如何获取用户权限? 后端(当前用户拥有的权限列表)-> 前端(通过后端的接口获取到,下文中我们把当前用户的权限列表叫做 permissi

  • Python+pyaudio实现音频控制示例详解

    简介 PyAudio是一个跨平台的音频处理工具包,使用该工具包可以在Python程序中播放和录制音频,也可以产生wav文件等 安装 pip install PyAudio 注意:使用该命令安装时可能会报错,报错内容如下: 针对该问题,我们使用whl文件进行安装,首先在网址下面找到以下文件并下载,根据自己的python版本及计算机系统下载相应文件即可. 下载完成后,切换到文件所在目录,使用如下命令安装即可 pip3 install PyAudio-0.2.11-cp38-cp38-win_amd6

  • Kotlin编程条件控制示例详解

    目录 本文总览 1. When 表达式 2. If 表达式 总结 本文总览 本篇来看看 Kotlin的条件控制,这一节知识点 建议与Java中的条件结构类比,会很好理解并记住. 1. When 表达式 在 Kotlin 用 when 来定义多个分支的条件表达式.Kotlin中这个语法与 java 中的 switch 语句非常类似.代码块的执行就是将参数与所有的分⽀条件顺序⽐较,直到满⾜某个分⽀条件:(示例 ) when (x) { 1 -> print("x == 1") 2 -

  • 基于Vue自定义指令实现按钮级权限控制思路详解

    思路: 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到sessionStorage中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息). 权限验证:通过token获取用户对应的 role,自定义指令,获取路由meta属性里btnPermissions( 注: meta.btnPermissions是存放按钮

  • swift相册相机的权限处理示例详解

    前言 最近在开发中遇到了获取相册相机权限的需求,通过查找相关的资料终于解决了,因为之后会用到所以决定记录下,下面话不多说了,来一起看看详细的介绍吧. 注意:须先在info.plist中添加两个keyNSPhotoLibraryUsageDescription, 和NSCameraUsageDescription, 内容填提示内容. 相机 // 使用 self.cameraPermissions(authorizedBlock: { print("打开相机") }, deniedBloc

  • 原生js中运算符及流程控制示例详解

    运算符 算数:+ 加.- 减.* 乘./ 除.% 求模 赋值:=.+=.-=.*=./=.%= 关系:>.<. >=. <=. ==. ===. !=. !== 逻辑:||或.&&与.!否 实例1.求模 window.onload = function(){ alert(0%2) //0 alert(1%2) //1 alert(2%2) //0 } 实例2.隔行变色 <body> <ol> <li>取模:就是求余数</li

  • C++中访问权限的示例详解

    众所周知,C++面向对象的三大特性为:封装,继承和多态.下面我们就先对封装做一些简单的了解.封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具.类的定义如下: class circle { public: //成员变量 int m_L; int m_H; public: //成员函数(方法) double get_Square() { return m_L*m_H; } } 在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和

  • Java编程访问权限的控制代码详解

    本文研究的主要是Java编程访问权限的控制的相关内容,具体介绍如下. 之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的. (1)首先是包名 使用一个类的时候,例如集合类,就需要引入这个包,然后再使用该包下面的类.如: package com.myown.iaiti; public class Print { static void print(String s){ System.out.println(s); } } 自

  • 编译安装redisd的方法示例详解

    安装方法: yum安装 查看yum仓库redis版本 [root@centos ~]# yum list redis Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Available Packages redis.x86_64 3.2.12-2.el7 myepel yum安装 [root@centos ~]# yum install redis -y 启动服务并设为开机启动

随机推荐