doris版本:3.0.0
ranger:2.6.0
ranger的日志配置在此文件中:ranger-2.6.0-admin/conf/logback.xml
添加插件的日志级别配置:
<logger name="org.apache.ranger.services.doris" additivity="false" level="debug">
<appender-ref ref="xa_log_appender"/>
</logger
doris-ranger集成官方文档
在此文章中找到
并下载通过,jd-gui
反编译工具打开,在idea中新建目录结构,并添加依赖,文本是使用gradle构建build.gradle
文件如下:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.9.23'
}
group = 'org.apache.ranger'
version = '3.0.0'
repositories {
mavenCentral()
}
dependencies {
api("org.apache.ranger:ranger-plugins-common:2.6.0")
testImplementation 'org.jetbrains.kotlin:kotlin-test'
}
test {
useJUnitPlatform()
}
kotlin {
jvmToolchain(8)
}
很遗憾,此包在github中么有找到源码,必须反编译了。
将几个文件源码分别复制idea中。修改:DorisClient
类,在initConnection
添加密码解码代码。
添加if代码块信息即可。本文用kotlin语言编译。可自行按逻辑编写java代码。
private fun initConnection() {
val prop = configHolder.rangerSection
val driverClassName = prop.getProperty("jdbc.driver_class")
val url = prop.getProperty("jdbc.url")
val properties = Properties()
properties["user"] = prop.getProperty("username")
if (prop.getProperty("password") != null) {
val pwdTmp= prop.getProperty("password")
val pwd=PasswordUtils.getDecryptPassword(pwdTmp)
properties["password"]=pwd
}
总结,doris源码中没有对ranger提供的密码解码导致,密码错误和无法被存储的假象。
附录:
PasswordUtils.getDecryptPassword
的测试
其逻辑是能解码就解码,不能解就返回原密码。
package org.apache.ranger.plugin.util
import org.junit.jupiter.api.Test
class PasswordUtilsTest {
@Test
fun testPasswordDecrypt(){
println("hello!")
val encryptedPassword="PBEWithHmacSHA512AndAES_128,tzL1AKl5uc4NKYaoQ4P3WLGIBFPXWPWdu1fRm9004jtQiV,f77aLYLo,1000,Nwv5d4wax5rgJLyu4bnSNw==,0eEjW1/qisHcE++8Af1QPA=="
val password1=PasswordUtils.getDecryptPassword(encryptedPassword)
println("from encrypted: ${password1}") // 能被正确解码:qaz123
val unencryptedPassword="qaz123"
val password2=PasswordUtils.getDecryptPassword(unencryptedPassword)
println("from unencrypted: ${password2}") // 就是原密码:qaz123
}
}
编译项目,并替换`ranger-2.6.0-admin/ews/webapp/WEB-INF/classes/ranger-plugins/doris/ranger-doris-plugin-3.0.0.jar`,重启ranger即可。
观察`ranger-admin-ranger-root.log`日志即可debug了。当然也可以在源码中添加LOG.info信息。
源码如下:
public static String getDecryptPassword(String password) {
String decryptedPwd = null;
try {
decryptedPwd = decryptPassword(password);
} catch (Exception var6) {
LOG.warn("Password decryption failed, trying original password string.");
decryptedPwd = null;
} finally {
if (decryptedPwd == null) {
decryptedPwd = password;
}
}
return decryptedPwd;
}