:个人凭据管理与 JDBC 连接池实践)
数据分析数据可视化大数据后端【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppelin1/zeppelin点击查看免费下载导读本文围绕 Apache Zeppelin 的**数据源授权Data Source Authorization**特性展开讲解如何让每位登录用户使用自己的数据库账号而非共享账号访问 MySQL、Vertica、Presto 等数据源。读完本文你将掌握在 Zeppelin UI 或通过 REST API 保存个人凭据的方法、凭据在conf/credentials.json中的存储与加密机制、凭据注入{entity.user}/{entity.password}占位符与密码打码的原理以及 JDBC 解释器如何基于这些凭据维护每用户连接池。什么是数据源授权数据源授权的核心思想是认证与授权交由数据源自身完成。Zeppelin 并不代替数据库判断某个用户能访问什么表而是把以谁的账号登录数据库这一环节交给用户自己决定数据库再依据该账号的权限决定其可见范围。典型场景如下你已经在 Vertica 数据库中拥有一个账号希望在 Zeppelin 中通过 JDBC 连接 Vertica 时使用这个账号而不是让所有定义在conf/shiro.ini中的用户共享同一个数据库账号。此时只需要把自己的凭据用户名 密码保存到 Zeppelin解释器即可在运行段落时自动使用它。这条特性的演进始于 ZEPPELIN-828由 Pull Request #860 实现后续的社区管理解释器适配进度可关注 ZEPPELIN-1070当前仓库中JDBC 解释器已完整支持该机制下文源码分析部分会给出依据。如何保存凭据信息通过 UI 下拉菜单添加在 Zeppelin 界面中打开 Credential 页面即可在数据源下拉菜单中新增凭据。该交互由 credential.controller.js 实现页面初始化时会调用GET /api/interpreter/setting拉取已配置的解释器名称列表并为 Entity 输入框提供自动补全angular.element(#entityname).autocomplete(...)方便你直接选中某个解释器名称作为 Entity新增凭据时通过PUT /api/credential提交{entity, username, password}列表中已有凭据可以就地编辑仅可改用户名和密码Entity 作为唯一键不可改或删除DELETE /api/credential/{entity}。Entity 的命名约定Entity 是区分每组凭据的键。官方建议其命名约定为Interpreter Name解释器名称例如为 JDBC 解释器保存的凭据Entity 就叫jdbc。这样解释器在运行时才能按命名规则找到对应的凭据下文JDBC 解释器如何按用户取凭据一节会说明。用户名与密码填写你自己的数据库账号例如 JDBC 解释器要连的 MySQL 用户名和密码。注原文档中引用的界面截图Credential 标签页与新增凭据表单位于docs/assets/themes/zeppelin/img/docs-img/目录下。由于该仓库的 docs 静态图片目录未包含这两张图本文不强行配图以文字说明代替。凭据的归属与持久化凭据按用户隔离存储归属规则如下若已启用 Shiro 认证参见 Shiro 认证指南凭据保存在当前登录用户名下若未启用认证凭据统一保存在anonymous用户名下所有凭据最终持久化到conf/credentials.json默认配置下配置文件路径由zeppelin.credentials.persist与 conf 目录共同决定见 ZeppelinConfiguration.java。持久化与加密由 Credentials.java 负责构造时读取zeppelin.credentials.persist默认true见 ConfVars 定义 ZeppelinConfiguration.java决定是否落盘若配置了zeppelin.credentials.encryptKey则用 Encryptor.java 对文件内容做AESAESEngine ZeroBytePadding加密后 Base64 编码再写入解密时反向操作保存/加载通过ConfigStorage完成支持本地文件系统等存储后端见 LocalConfigStorage.java 与 FileSystemConfigStorage.java。因此为保护生产环境中的数据库口令建议在conf/zeppelin-site.xml中设置property namezeppelin.credentials.encryptKey/name valueyour-encrypt-key/value descriptionKey used to encrypt credentials. If not set, credentials are stored in plain text./description /property通过 REST API 管理凭据凭据管理同样暴露为 REST API由 CredentialRestApi.java 实现Path(/credential)接口行为与 UI 页面一一对应GET /api/credential返回当前用户的全部凭据实体、用户名、密码PUT /api/credential新增/更新凭据请求体 JSON 为{entity: jdbc, username: user, password: password}任一字段为空时返回400 BAD_REQUESTDELETE /api/credential删除当前用户的全部凭据不存在时返回404 NOT_FOUNDDELETE /api/credential/{entity}删除指定 Entity 的凭据不存在时返回404 NOT_FOUND。完整的请求/响应示例可参考 Credential REST API 文档例如保存一条凭据curl -X PUT -H Content-Type: application/json -d {entity:jdbc,username:mysql_user,password:mysql_password} \ http://[zeppelin-server]:[zeppelin-port]/api/credential/需要说明的是上述 REST API 文档中的示例以entity1/user1/password1等占位符形式给出实际使用时应替换为真实 Entity 与账号口令。该 API 的测试用例位于 CredentialsRestApiTest.java覆盖了凭据的存取与删除流程。不同数据源的凭据使用差异原文档针对三类常见数据源给出了差异化的说明JDBC 解释器需要维护每用户per-user的连接池。解释器的interpret方法以用户字符串为参数从对应用户的连接池中取出连接执行 JDBC 调用。具体实现见下文源码分析。Presto如果 Presto 后端代码基于用户执行 HDFS 授权那么可以不提供密码凭据中可以只保存用户名。Vertica 与 MySQL必须为用户存储密码信息连接时以用户名 密码完成认证。源码级原理解析JDBC 解释器如何按用户取凭据JDBCInterpreter.java 完整实现了凭据驱动的连接管理关键逻辑如下解析当前用户getUser(context)优先取登录用户Shiro principal若为anonymous且解释器设置了default.user则回退使用该属性值JDBCInterpreter.java。解析 Entity 命名getEntityName(replName, propertyKey)规定——当解释器名恰为jdbc时Entity 取属性键本身default否则取解释器名JDBCInterpreter.java。这正是官方建议Entity 用解释器名的代码依据。读取凭据getUsernamePassword(context, entity)从context.getAuthenticationInfo().getUserCredentials()中按 Entity 取出UsernamePasswordJDBCInterpreter.java。每用户连接池setUserProperty(context)在解释器自身未配置default.user/default.password时用当前用户凭据覆盖用户属性随后createConnectionPool(url, user, properties)以jdbc:apache:commons:dbcp:default{user}这样的池名注册 DBCP 连接池JDBCInterpreter.java、JDBCInterpreter.java从而实现一个用户一个连接池。若找不到该用户的凭据则关闭该用户连接池closeDBPool(user)。与此对应的官方文档说明见 JDBC 解释器文档当default.user与default.password被删除使用 X 按钮后解释器会转而使用用户在 Credential 页面保存的凭据建立连接。凭据注入与密码打码除 JDBC 解释器外Zeppelin 还提供了通用的凭据注入机制由 Paragraph.java 与 CredentialInjector.java 实现解释器属性injectCredentials常量定义见 Constants.java控制是否启用注入默认false启用后段落的脚本中形如{entity.user}与{entity.password}的占位符会被替换为对应 Entity 的用户名与密码注入的密码在返回结果中会被打码CredentialInjector.hidePasswords(ret)会把结果中出现的密码文本替换为###避免凭据随结果泄露覆盖 HTML / TEXT / TABLE 三种结果类型。例如在段落中写%jdbc SELECT * FROM table WHERE creator {jdbc.user}启用injectCredentials后{jdbc.user}会被替换为当前用户在 Credential 页面中为 Entityjdbc保存的用户名。凭据的数据模型凭据按用户 → 多个 Entity → 用户名/密码三层组织顶层是 Credentials.java 持有的MapString, UserCredentials credentialsMapkey 为用户名每个UserCredentials内部再按 Entity 维护多组UsernamePassword其结构定义见 CredentialsInfoSaving.java 等org.apache.zeppelin.user包下的类落到conf/credentials.json时大致形态为{ credentialsMap: { anonymous: { userCredentials: { jdbc: { username: mysql_user, password: mysql_password } } } } }以上 JSON 仅用于示意结构实际字段名以CredentialsInfoSaving的 Gson 序列化结果为准。相关单元测试见 CredentialsTest.java 与 EncryptorTest.java。使用注意事项先启用认证再谈用户隔离如果希望每位用户使用各自数据库账号请先按 Shiro 认证指南 配置认证否则所有凭据都归入anonymous也就失去了个人凭据的意义。Entity 命名保持一致JDBC 解释器按getEntityName规则解释器名为jdbc时取default否则取解释器名查找凭据保存凭据时 Entity 务必与解释器命名匹配。密码存储安全默认zeppelin.credentials.persisttrue会将凭据写入conf/credentials.json生产环境应配置zeppelin.credentials.encryptKey启用 AES 加密并保护好该密钥文件本身。凭据注入按需开启injectCredentials默认关闭只有确实需要在段落脚本中使用{entity.user}/{entity.password}占位符时才开启且注意其会对返回结果中的密码做###打码处理。数据库侧差异Presto 在依赖 HDFS 授权时可只保存用户名Vertica、MySQL 等必须同时保存用户名与密码。适用范围该特性最初面向自定义第三方解释器设计ZEPPELIN-828当前仓库中 JDBC 解释器已原生支持使用其他解释器时请以其文档为准确认是否支持凭据读取。总结数据源授权让 Zeppelin 把数据库认证与授权交还给数据源本身同时通过 UI、REST API 两层入口为用户提供个人凭据的保存、查询、更新与删除能力。其底层由Credentials持久化 AES 加密、CredentialRestApiREST 接口、JDBCInterpreter每用户连接池与CredentialInjector占位符注入 密码打码协同完成。围绕该特性的核心代码与文档均可在当前仓库中定位到datasource_authorization.md、Credentials.java、JDBCInterpreter.java、credential.controller.js。赞分享数据分析数据可视化大数据后端【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppelin1/zeppelin点击查看免费下载相关推荐Apache Zeppelin 数据源授权Data Source Authorization完全指南让每个用户使用自己的数据库凭据Apache Zeppelin 数据源授权Data Source Authorization完全指南让每个用户使用自己的数据库凭据 数据源授权是 Apac后端前端大数据数据分析Apache Zeppelin 数据源授权指南凭据管理、注入机制与源码实现解析Apache Zeppelin 数据源授权指南凭据管理、注入机制与源码实现解析 数据源授权Data Source Authorization解决的是多个数据分析数据可视化大数据后端前端任务调度Apache Zeppelin 通用 JDBC Interpreter 使用指南连接任意数据源、连接池调优与多数据库实战Apache Zeppelin 通用 JDBC Interpreter 使用指南连接任意数据源、连接池调优与多数据库实战 Apache Zeppelin 的数据分析数据可视化大数据后端上一篇Hitboxer告别游戏操作冲突实现键盘精准控制的终极解决方案下一篇终极Hitboxer指南免费开源SOCD清洁工具让你的游戏操作更精准创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考