0
点赞
收藏
分享

微信扫一扫

探索Metabase历程

全栈学习笔记 2022-01-20 阅读 63

前言

有天领导走过来和你说,Hi 小花,我们正在用metabase做一些数据分析,但是有些功能是不符合我们要求的,例如

1、权限管理:只能控制db或者集合,无法控制按钮,例如分享按钮,能通过发送邮箱分享给任何人。

2、我们能否通过二次开发来定制一些功能

3、他的权限是如何实现,能否通过修改表来间接修改权限

4、能否通过Ldap来授权登陆

5、其他

在github上搜索,有详细的介绍哈,有进度随时告诉我

好的老板!!

思考

啥是metabase?metabase是谁?干嘛的?我应该咋做?

正文

既然源码在github上,我立马在上面搜素这个metabase东西,看看他是何方妖鬼。

搜索的结果,原来是国外的一个开源软件,用于数据分析,只要你懂点sql语句就能够操作,即使你不懂sql,只要知道表字段也能够展示出漂亮的报表,下面从几个方面来介绍下这个未来和尚。

一、主要功能

功能主要包括2部分:

1、基础管理:包括登陆方式、管理员一些设置、权限设置、账号设置、创建文件夹、仪表盘等等

2、创建问题:包括3中方式(简单查询、自定义查询、原生查询)

3、额外功能:例如分享、嵌套在别的页面里等

这部分大家可以看官方介绍,比较齐全,我就不细说了,请点击 github地址

二、本地二次开发

1、项目介绍

该项目采用的框架也分为浅短和后端

前端框架:React + Redux + D3

后端框架:Clojure(脚本语言) + Ring(中间件) + Compojure(路由框架) + Toucan(ORM框架)

数据库默认是h2,不利于分析展示,我再后期将其迁移成mysql了,迁移方案后面在讲

我们想要程序运行起来,那么要安装其相应的开发环境

前端环境:

安装node.js

安装yarm

安装leiningen(leiningen.org/)

后端环境:

后端框架运行在jvm虚拟机上,所以要安装jdk,版本可以选择在jdk8以上

具体安装环境步骤,大家可参考下面链接 安装环境参考

1、克隆代码

从github上选择一个分支将代码克隆下来,这里要注意,打开github地址默认分支是master分支,而master分支代码缺少project.clj文件,会导致下载下来的代码通过命令无法编译和运行,所以大家要么选择其他分支要么从其他分支将该文件拷贝过去

2、编译启动

依次执行:

yarn install

yarn build-hot

yarn run build

lein ring server

我本地在运行 lein ring server的时候会提示找不到lein ,经过多方查找,掉了上亿根头发,终于在项目中找到一个package.json文件,文件中会定义执行脚本的,找到一个dev,执行yarn run dev,正常启动,大家可以做一个参考。

启动后,在页面输入 localhost:3000,会出现指导页面,注册账号之类的指导信息,默认初始登陆账号设置成管理员,管理员可以设置基础信息,其中权限之类的就是管理员来设置。

3、打成jar包

进入项目文件,输入./bin/build命令,这个过程会很漫长,过程中如果出现错误,根据提示来做,可能需要跳过,也可能要重启执行命令,执行完后在路径/metabase/target/uberjar目录下生成metabase.jar包 ,通过jar启动就比较简单了 ,进入metabase.jar所在的文件夹,执行如下命令

java -jar metabase.jar

4、我所在的公司将员工信息记录在ldap中,所以这里的登陆方式要通过ldap来登陆,再登陆的过程中,我们通过F12,可以得到,首先会调用以下登陆接口,拿到系统生成的token,再后续的登陆中将该token设置到headers中,key为 metabase.SESSION value下面接口返回的值

http://localhost:3000/api/session

配置ldap授权界面如下图所示

 

填入ldap地址、端口号、账号、密码、安全方式、 用户结构等等

这里我遇到一个问题,我当时没有配置用户组搜索库、打开了同步组成员,退出登陆后通过ldap登陆,提示找不到信息错误,最后实在没办法,配置了用户组,就可以正常通过ldap登陆了。

这里还有一个问题,我第一次登陆不是通过ldap登陆,只是同步普通登陆,按照官方说法,首先会通过ldap登陆,ldap找不到用户后,才会通过账号登陆,但是我通过ldap登陆失败后,然而程序没有查询账户表,通过账号登陆,直接就报错了,导致任何人都无法登陆。大家不觉得这个逻辑有问题吗?我认为这个逻辑是有问题,应该是先通过账号登陆,如果账号不存在再尝试通过ldap登陆,因为账号是直接查询数据库,而无需通过远程网络进行接口调用。不太清楚官方的逻辑。

通过上面分析,再代码里搜索 /api/session url,定位到 session.clj文件,在139行

(or (ldap-login username password device-info)
(email-login username password device-info) ; Then try local authentication
   

先通过ldap-login登陆,再通过email-login登陆, 所以我们将其调换位置,让程序先通过email登陆再通过ldap登陆

(or(email-login username password device-info) ; Then try local authentication
    (ldap-login username password device-info)

这样即使我ldap配置存在问题,再登陆的时候也不至于管理员都登陆不上的情况,同样也符合正常开发的流程,先查询本地,在查询远程数据逻辑。

5、替换数据库

metabase默认使用h2数据库,不利于后续的权限修改和数据库数据更改,要改成mysql,需要将h2的数据迁移到新的mysql数据库。

大家可以参考如下文章迁移文档

我再迁移的时候遇到一个问题,再迁移的过程中,执行报错,如下图

 大体意思是权限不足,将数据库的权限修改成最大后,正常迁移过去

6、下面回答一下前言中提到的问题

1)权限管理:只能控制db或者集合,无法控制按钮,例如分享按钮,能通过发送邮箱分享给任何人。

结论:首先当前系统是不支持控制到按钮,但是我们可以通过二次开发,页面再展示分享权限的时候,根据返回的权限来控制起是否展示。

2)我们能否通过二次开发来定制一些功能

结论:我们能进行二次开发,如果要学习他的开发语言,成本比较高,但是能通过前端调用我们自己的接口来做一些开发。而且他对外提供的接口我们都可以调用,只要符合他的调用逻辑

3)他的权限是如何实现,能否通过修改表来间接修改权限

结论:他的权限是通过几张表实现的,这也是将数据源迁移到mysql其中的好处,能直观的看到表的结构

答案是可以的,程序中权限没有做缓冲,只要我们能修改表的数据就能够实时实现权限的控制。

4)能否通过Ldap来授权登陆

结论:肯定可以了,我都实现了

这次分享先到此为止,很开心又学到了一些东西,扩展了自己的知识面,下期我可能会分享二次开发Ldap的过程经历,期待我们下期再见。

举报

相关推荐

0 条评论