目前,apache kylin提供了多种登录认证的方式,包括预先定义的用户名和密码登录,ldap以及sso单点登录,本文主要介绍前面两种方式,sso的登录认证后面有机会再做介绍。
在kylin.properties配置文件中,通过配置kylin.security.profile这个参数项来决定要使用的登录认证方式。一共有三个选项,分别是:
- testing,表示使用预先定义好的用户名和密码进行登录认证;
- ldap,表示使用ldap服务器进行登录认证;
- saml,表示使用sso单点登录,并且使用ldap进行相关认证,使用了Spring Security SAML Extension
下面就来详细介绍一些前面两种登录认证方式。
预先定义的用户名密码登录认证
Kylin默认提供了一种用户名和密码的登录认证方式,当配置为testing的参数项之后,就可以用如下的三组用户名和密码登录Kylin进行操作了:
- ADMIN/KYLIN,管理员权限,可以进行任意的操作;
- MODELER/MODELER,可以对cube进行编辑设计,提交job任务等;
- ANALYST/ANALYST,进行query查询
相应的用户名和密码配置在:tomcat/webapps/kylin/WEB-INF/classes/kylinSecurity.xml路径下,如下图所示:
我们可以在这里添加新用户,修改密码等。要注意的是,这里的密码是需要经过加密的,而不是明文,密码生成的方法如下所示:
// 这里是maven依赖 <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> // 这里是使用代码 String password="KYLIN"; org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder encoder = new org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder(); String result = encoder.encode(password); System.out.println(ret);
以上代码输出的结果,就是指定的密码经过加密之后得到的结果。我们将该结果写到配置文件中即刻。另外,kylin还提供了通过curl命令来访问kylin的restful api,例如,我们可以通过如下命令来查询一个project指定表的数据:
curl -X POST -H "Authorization: Basic XXXXXXXXX" -H "Content-Type: application/json" -d '{ "sql":"select count(*) from TEST_KYLIN_FACT", "project":"learn_kylin" }' http://localhost:7070/kylin/api/query
其中,XXXXXXXXX的内容,是使用Base64加密用户名和密码之后得到的结果,使用方法如下所示:
import org.apache.commons.codec.binary.Base64; String content = "ADMIN/KYLIN"; byte[] bytes = Base64.encodeBase64(content.getBytes()); String result = new String(bytes); System.out.println(result);
这种登录认证方式非常简单,无需其他任何配置即可使用。但是这种使用方式也存在一定的问题,灵活性比较差,每次进行用户的配置都需要手动修改配置文件,生产环境中,往往不太适用。下面就来介绍一下使用LDAP进行kylin的登录认证。
LDAP登录认证
使用ldap方式进行登录认证,我们首先需要配置ldap服务器的相关信息,如下所示:
kylin.security.profile=ldap kylin.security.acl.admin-role=KYLIN_ADMIN_GROUP kylin.security.ldap.connection-server=ldap://<your_ldap_host>:<port> kylin.security.ldap.connection-username=<your_user_name> kylin.security.ldap.connection-password=<your_password_encrypted>
其中,admin-role表示,KYLIN_ADMIN_GROUP这个组下面的所有成员,都具有管理员权限,与第一种方式的ADMIN用户一样。我们可以在ldap服务器中新建一个用户组来专门存放admin用户,或者直接使用已有的组,都可以如下图所示:
我们新建了KYLIN_ADMIN_GROUP用来存放admin用户,KYLIN_QUERY_GROUP是我们用来测试存储其他kylin用户的,无需配置在kylin.properties中。对于非管理员权限的用户,我们可以分别创建相应的组,然后将相应的用户加入组中,在kylin页面使用ADMIN用户登录之后,对相应的用户赋权,目前有四种权限可选,分别是:ADMIN/MANAGEMENT/OPERATION/QUERY,权限添加好了之后,我们可以使用相应的用户登录了。接着,我们需要配置ldap服务器的服务器地址,用户名以及密码。这里的密码依然是加密之后的结果,我们可以使用如下的命令对密码进行加密,这里部署的是2.6.3版本的kylin:
cd $KYLIN_HOME/tomcat/webapps/kylin/WEB-INF/lib/ java -classpath kylin-server-base-2.6.3.jar:kylin-core-common-2.6.3.jar:spring-beans-4.3.10.RELEASE.jar:spring-core-4.3.10.RELEASE.jar:commons-codec-1.9.jar org.apache.kylin.rest.security.PasswordPlaceholderConfigurer AES password
将结果写到配置文件即可。接着,我们来配置普通用户以及服务账户搜索规则,如下所示:
# ## LDAP user account directory; kylin.security.ldap.user-search-base=ou=people,dc=bdms,dc=163,dc=com kylin.security.ldap.user-search-pattern=(&(userid={0})) kylin.security.ldap.user-group-search-base=ou=groups,dc=bdms,dc=163,dc=com #kylin.security.ldap.user-group-search-filter= # ## LDAP service account directory kylin.security.ldap.service-search-base=ou=people,dc=bdms,dc=163,dc=com kylin.security.ldap.service-search-pattern=(&(userid={0})) kylin.security.ldap.service-group-search-base=ou=groups,dc=bdms,dc=163,dc=com
以上这些配置需要根据ldap服务器的实际结构来进行调整,并非固定的。需要注意的是,由于目前kylin只支持用户名/密码的登录方式,因此ldap中的kerberos用户无法使用,我们需要新增Simple Security Object类型的用户,如下所示:
最后,将新建的用户加入相应的组即可。这样,我们就可以在ldap服务器中配置用户来登录kylin服务了。关于sso单点登录的方式,由于目前本人手头没有相应的环境,也没有进行测试,这里就不再介绍,感兴趣的可以参考官方文档进行配置学习,以后有机会的话,再跟大家一起分享。
参考文档
http://kylin.apache.org/docs/howto/howto_use_restapi.html
http://kylin.apache.org/docs/howto/howto_ldap_and_sso.html
https://www.jianshu.com/p/39bc4cc45a87
https://blog.csdn.net/wild46cat/article/details/71102103