ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DataHub Role 实体详解:外部数据平台访问权限的建模、写入与查询实战

DataHub Role 实体详解:外部数据平台访问权限的建模、写入与查询实战 DataHub Role 实体详解外部数据平台访问权限的建模、写入与查询实战【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本文围绕 DataHub 元数据模型中的role实体外部访问管理角色展开它如何把 Snowflake、BigQuery 等外部 IAM 系统中的角色建模为可发现、可检索、可审计的元数据如何通过 Python SDK 与 REST API 完成角色创建、成员分配、数据集关联与查询以及它与dataHubRole、roleMembership等概念的本质区别。读完本文你将掌握在 DataHub 中落地访问发现—自助申请—统一审计的完整方法并理解底层 PDL 模型与 GraphQL 解析器的实现原理。一、Role 实体是什么在 DataHub 中role实体代表来自外部源系统如 Snowflake、BigQuery的访问管理角色。这些角色在源系统内控制对数据资产的访问权限而 DataHub 的作用是把它们建模、展示出来帮助数据消费者理解要访问某个数据集我需要具备哪种角色。该实体是数据集访问管理Access Management能力的核心载体由 metadata-models/docs/entities/role.md 完整定义。它与 DataHub 平台自身的权限体系相互独立外部角色描述的是数据平台上的权限而非DataHub 界面上的权限。1.1 身份标识IdentityRole 实体通过单一唯一标识符来识别该标识符通常继承自外部 IAM 系统中角色定义的 ID要求在整个组织的数据平台范围内保持稳定且唯一。在底层这一身份由 RoleKey.pdl 定义其结构仅包含一个id: string字段注释中明确说明它是外部访问管理 IAM 的唯一 id。一个典型角色标识符形如urn:li:role:snowflake_reader_roleURN 遵循urn:li:role:{role_id}的固定模式其中{role_id}即RoleKey中的id字段值。由于RoleKey是角色的身份方面identity aspect它的值直接决定 URN 的稳定性——如果外部系统中角色 ID 发生变化对应 URN 也会变化因此建议在摄取时保持 ID 与外部 IAM 系统一致。1.2 核心能力总览能力对应 Aspect说明角色属性roleProperties名称、描述、访问级别、申请链接角色成员actors被授予该角色的用户corpuser与组corpGroup数据集关联access位于 dataset 实体上指定数据集被哪些角色授权访问查询检索标准 REST API / Python SDK / GraphQL读取全部 Aspect、按名称搜索角色二、Role 实体的 Aspect 模型PDL 源码级解析DataHub 的实体模型使用 Pegasus PDL 定义。role实体的全部 Aspect 位于 metadata-models/src/main/pegasus/com/linkedin/role 目录与com.linkedin.common命名空间下。2.1 roleProperties角色属性RoleProperties.pdl 定义了角色在外部系统中的关键信息字段类型是否必填语义namestring必填外部系统中角色的显示名称如 Snowflake Reader Role并带有Searchable注解支持自动补全与搜索descriptionstring可选说明角色用途与范围的可读描述typestring必填角色提供的访问级别如READ、WRITE、ADMINPDL 注释注明取值可为 READ、ADMIN、WRITErequestUrlstring可选用户可在外部系统申请该角色访问权限的链接createdAuditStamp可选创建审计戳记值得注意的源码细节name字段带有Searchable注解配置了WORD_GRAM分词类型、开启自动补全、boostScore设为 10.0、searchTier为 1并将别名映射为_entityName。这意味着角色的名称会被纳入 DataHub 的实体搜索索引且享有较高权重——这是 REST 搜索接口与 UI 搜索框能够按角色名命中的底层基础。2.2 actors角色成员用户与组Actors.pdl 记录外部系统中被授予该角色的用户与组包含两个可选数组users:array[RoleUser]—— 被授予角色的 corp user 列表groups:array[RoleGroup]—— 被授予角色的 corp group 列表其中 RoleUser.pdl 的user字段带有Relationship { name: Has, entityTypes: [corpuser] }注解RoleGroup.pdl 的group字段同样带有RelationshipHas目标类型corpGroup。这些注解会在图存储中建立角色到用户/组的关系边是查看某角色下有哪些用户/组查看某用户拥有哪些角色等图查询能力的实现基础。2.3 access数据集与角色的关联角色与数据集的连接通过挂在dataset 实体上的accessaspect 实现。Access.pdl 结构极简仅含一个可选字段roles: array[RoleAssociation]注释明确其用途是将角色关联到数据集或任何资产。而 RoleAssociation.pdl 目前仅含一个urn字段但它带有两个关键注解Relationship { name: AssociatedWith, entityTypes: [role] }在图上建立数据集 —AssociatedWith→ 角色的关系Searchable以roles作为字段名、hasRoles作为是否存在标记、filterNameOverride为Role意味着可以在搜索过滤器中按角色筛选数据集因此从源码可以推断数据集页面上展示的哪些角色提供了对该数据集的访问正是读取该 aspect 并沿关系边渲染的结果同时也支撑了按角色过滤数据集的搜索能力。三、实战一用 Python SDK 创建角色与分配成员DataHub 的 Python SDKacryl-datahub是写入元数据的主要途径。以下示例均可在仓库 metadata-ingestion/examples/library 目录中找到完整可运行版本。3.1 创建带属性的角色role_create.py 演示了通过 REST Emitter 发送 MetadataChangeProposalMCP创建角色import os from datahub.emitter.mcp import MetadataChangeProposalWrapper from datahub.emitter.rest_emitter import DatahubRestEmitter from datahub.metadata.schema_classes import RolePropertiesClass # Create the role URN # Role URNs follow the pattern: urn:li:role:{role_id} role_urn urn:li:role:snowflake_reader_role # Define the role properties role_properties RolePropertiesClass( nameSnowflake Reader Role, descriptionProvides read-only access to analytics datasets in Snowflake, typeREAD, requestUrlhttps://mycompany.okta.com/access/request/snowflake-reader, ) # Create a metadata change proposal mcp MetadataChangeProposalWrapper( entityUrnrole_urn, aspectrole_properties, ) # Emit the metadata change gms_server os.getenv(DATAHUB_GMS_URL, http://localhost:8080) token os.getenv(DATAHUB_GMS_TOKEN) emitter DatahubRestEmitter(gms_servergms_server, tokentoken) emitter.emit(mcp) print(fCreated role: {role_urn})要点说明RolePropertiesClass是 PDL 中RoleProperties生成的 Python 类字段一一对应name、description、type、requestUrlMCP 的entityUrn指向角色 URNaspect承载rolePropertiesGMS 地址与 Token 通过环境变量DATAHUB_GMS_URL默认http://localhost:8080与DATAHUB_GMS_TOKEN注入便于在受认证保护的部署中运行若角色已存在该 MCP 会执行 upsert 语义更新属性适合幂等摄取。3.2 为角色分配用户与组role_assign_actors.py 展示如何通过actorsaspect 将用户与组授予角色from datahub.emitter.mce_builder import make_group_urn, make_user_urn from datahub.emitter.mcp import MetadataChangeProposalWrapper from datahub.emitter.rest_emitter import DatahubRestEmitter from datahub.metadata.schema_classes import ( ActorsClass, RoleGroupClass, RoleUserClass, ) # Create the role URN # Role URNs follow the pattern: urn:li:role:{role_id} role_urn urn:li:role:snowflake_reader_role # Define the users and groups assigned to this role actors ActorsClass( users[ RoleUserClass(usermake_user_urn(john.doe)), RoleUserClass(usermake_user_urn(jane.smith)), ], groups[ RoleGroupClass(groupmake_group_urn(data-analysts)), RoleGroupClass(groupmake_group_urn(business-intelligence)), ], ) # Create a metadata change proposal mcp MetadataChangeProposalWrapper( entityUrnrole_urn, aspectactors, ) # Emit the metadata change emitter DatahubRestEmitter(gms_serverhttp://localhost:8080) emitter.emit(mcp) print(fAssigned users and groups to role: {role_urn})要点说明make_user_urn(john.doe)与make_group_urn(data-analysts)由datahub.emitter.mce_builder提供分别生成urn:li:corpuser:john.doe与urn:li:corpGroup:data-analysts保证与 DataHub 现有的用户/组实体 URN 一致ActorsClass即Actorsaspect 的 Python 类RoleUserClass/RoleGroupClass对应RoleUser/RoleGroup记录注意此处的成员关系记录的是外部系统中已完成的角色授予DataHub 本身并不执行授权动作详见第六节外部系统集成的边界说明。3.3 将角色关联到数据集role_assign_to_dataset.py 演示写入 dataset 实体上的accessaspectfrom datahub.emitter.mce_builder import make_dataset_urn from datahub.emitter.mcp import MetadataChangeProposalWrapper from datahub.emitter.rest_emitter import DatahubRestEmitter from datahub.metadata.schema_classes import AccessClass, RoleAssociationClass # Create the dataset URN dataset_urn make_dataset_urn( platformsnowflake, nameanalytics_db.public.user_events, envPROD ) # Define the roles that provide access to this dataset # Role URNs follow the pattern: urn:li:role:{role_id} access_aspect AccessClass( roles[ RoleAssociationClass(urnurn:li:role:snowflake_reader_role), RoleAssociationClass(urnurn:li:role:snowflake_writer_role), RoleAssociationClass(urnurn:li:role:snowflake_admin_role), ] ) # Create a metadata change proposal mcp MetadataChangeProposalWrapper( entityUrndataset_urn, aspectaccess_aspect, ) # Emit the metadata change emitter DatahubRestEmitter(gms_serverhttp://localhost:8080) emitter.emit(mcp) print(fAssociated roles with dataset: {dataset_urn})要点说明make_dataset_urn(platformsnowflake, nameanalytics_db.public.user_events, envPROD)会生成形如urn:li:dataset:(urn:li:dataPlatform:snowflake,analytics_db.public.user_events,PROD)的标准数据集 URNRoleAssociationClass对应RoleAssociation记录目前只需提供角色 URN一个数据集可以关联多个角色对应数据集访问控制全景的可视化基础。四、实战二查询角色信息4.1 通过 REST API 查询单个角色标准 REST API 的实体端点可直接读取角色完整信息curl http://localhost:8080/entities/urn%3Ali%3Arole%3Asnowflake_reader_role返回的完整角色实体将包含roleKey身份方面identity aspect即RoleKey保存角色 idroleProperties名称、描述、类型与申请 URLactors分配给该角色的用户与组列表。注意 URL 中 URN 需做百分号编码urn:li:role:snowflake_reader_role编码为urn%3Ali%3Arole%3Asnowflake_reader_role。4.2 通过 Python SDK 查询角色role_query.py 使用DataHubGraph客户端按 Aspect 粒度读取from datahub.ingestion.graph.client import get_default_graph from datahub.metadata.schema_classes import ActorsClass, RolePropertiesClass from datahub.metadata.urns import RoleUrn graph get_default_graph() role_urn RoleUrn(snowflake_reader_role) props graph.get_aspect(entity_urnstr(role_urn), aspect_typeRolePropertiesClass) if props is None: raise SystemExit(fRole not found: {role_urn}) print(fRole URN: {role_urn}) print(fName: {props.name}) print(fDescription: {props.description}) print(fType: {props.type}) print(fRequest URL: {props.requestUrl}) actors graph.get_aspect(entity_urnstr(role_urn), aspect_typeActorsClass) if actors is not None: if actors.users: print(fUsers: {[u.user for u in actors.users]}) if actors.groups: print(fGroups: {[g.group for g in actors.groups]})要点说明RoleUrn(snowflake_reader_role)是datahub.metadata.urns中提供的角色 URN 辅助类自动拼接成完整 URNget_aspect可分别拉取RolePropertiesClass与ActorsClass两个 aspect实现按需读取props is None分支用于处理角色不存在的情况get_default_graph()依赖环境配置如DATAHUB_GMS_URL等建立与 GMS 的连接。4.3 通过 REST API 搜索角色按名称关键字搜索角色curl -X POST http://localhost:8080/entities?actionsearch \ -H Content-Type: application/json \ -d { entity: role, input: reader, start: 0, count: 10 }该请求会在角色名称上执行搜索并返回匹配的角色 URN 列表。其底层能力来自RoleProperties.name字段上的Searchable注解WORD_GRAM分词 自动补全 高权重即前面 2.1 节分析的搜索索引配置。start/count参数支持分页input为搜索关键字。五、集成关系与 GraphQL API5.1 与 CorpUser、CorpGroup 的关系Role 实体与用户、组实体之间存在直接关系RoleUser通过Has关系将角色关联到corpuser实体RoleGroup通过Has关系将角色关联到corpGroup实体。这些关系由RoleUser.pdl与RoleGroup.pdl中的Relationship注解声明支撑三类典型场景查看哪些用户/组拥有特定角色反查某个用户或组被分配了哪些角色对整个数据生态的访问模式进行审计。5.2 与 dataHubRole 的严格区分role实体与dataHubRole实体是两个完全不同的概念极易混淆维度role本文主题dataHubRole来源外部源系统的访问管理角色Snowflake 角色、BigQuery 角色等DataHub 平台自身的内置角色控制对象外部数据平台中数据资产的访问DataHub 平台功能的权限如 admin、editor承载模型roleProperties、actors、dataset 上的accessDataHubRoleInfo见 DataHubRoleInfo.pdl、DataHubRoleKey特别重要的一点corpuser与corpGroup实体上的roleMembershipaspect见 RoleMembership.pdl引用的是dataHubRole实体而不是本文讨论的外部role实体。在建模与查询时务必注意区分避免把 DataHub 平台权限与外部数据平台权限混为一谈。5.3 GraphQL API 与解析器实现role实体通过 DataHub GraphQL API 的Role类型对外暴露关键解析器集中在 datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/role 与types/rolemetadata包解析器文件职责RoleTypeRoleType.java提供角色实体的搜索与批量加载能力ListRolesResolverListRolesResolver.java查询系统中的全部角色BatchAssignRoleResolverBatchAssignRoleResolver.java向用户/组批量分配角色AcceptRoleResolverAcceptRoleResolver.java接受角色分配的工作流入口仓库中同时提供对应的单元测试如 ListRolesResolverTest.java、BatchAssignRoleResolverTest.java、AcceptRoleResolverTest.java可结合测试用例进一步理解各解析器的入参与行为。5.4 前端 UI 的访问管理组件数据集页面上的Access Management标签页由 AccessManagement.tsx及 entityV2 下的对应版本实现。从组件源码看它通过useGetExternalRolesQuery拉取数据集的外部角色数据渲染一张角色表格对用户已拥有访问权的角色显示禁用态的 Granted 按钮对可申请的角色显示可点击的 Request 按钮点击后跳转到角色的requestUrl完成自助申请。六、典型使用模式结合实体能力与 UI 组件role实体最常见的落地场景有四类访问发现Access Discovery数据消费者在数据集详情页即可看到哪些角色提供了对该数据集的访问据此判断自己是否具备访问资格自助式访问申请Self-Service Access Requests用户识别出合适的角色后通过requestUrl跳转到外部系统发起访问申请减少人工沟通成本访问审计Access Auditing合规团队可以通过角色与用户/组的关系追踪敏感数据集分别被哪些角色、哪些成员覆盖形成审计证据统一访问视图Unified Access View平台团队借助role实体将多个数据平台Snowflake、BigQuery 等的访问控制集中到 DataHub 一个视图内消除信息孤岛。七、已知边界与注意事项7.1 仅支持数据集实体当前role实体与访问管理能力只支持 dataset 实体虽然角色在概念上可适用于仪表盘、图表等其他数据资产但accessaspectAccess.pdl目前仅为数据集定义。未来的增强方向是将其扩展到更多实体类型。7.2 只建模、不管理role实体设计上仅用于表示外部系统中已存在的角色。DataHub 不会直接创建或管理这些角色本身——角色成员的授予与回收provisioning / de-provisioning必须在源系统中执行DataHub 只负责建模、发现与文档化供消费与审计。7.3 需要显式开启 UI 功能自托管部署中Access Management UI 功能默认关闭。要启用 UI 中的角色可视化需要为datahub-gms服务设置环境变量SHOW_ACCESS_MANAGEMENTtrue未开启时角色元数据仍可通过 REST API、Python SDK 与 GraphQL 正常读写只是前端数据集页面不会展示访问管理标签页。7.4 处于活跃开发中role实体与访问管理能力目前处于活跃开发阶段功能与模型均可能变化。从模型注释与文档可确认的规划方向包括除角色外进一步建模外部策略policies从 BigQuery、Snowflake 等源自动抽取角色元数据将角色支持扩展到数据集以外的更多实体类型引入带审批流程的高级访问申请工作流。八、延伸阅读实体模型定义metadata-models/docs/entities/role.md全部实体文档索引metadata-models/docs/entitiesPDL 模型源码metadata-models/src/main/pegasus/com/linkedin/role、metadata-models/src/main/pegasus/com/linkedin/common/Access.pdlPython SDK 示例metadata-ingestion/examples/libraryrole_create.py、role_assign_actors.py、role_assign_to_dataset.py、role_query.pyGraphQL 解析器datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/role前端 UI 组件datahub-web-react/src/app/entity/shared/tabs/Dataset/AccessManagement【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表