semtech/mu-authorizationSPARQL端点授权服务(SEAS)是一个放置在SPARQL端点前的层,它基于用户的会话信息和数据访问权限重写该端点上的查询。
其核心思想是:数据被组织到图中,对这些图的访问被限制为特定角色集。每组角色与一个组相关联。当INSERT查询发送到SPARQL端点时,SEAS会拦截该查询。然后SEAS遍历其不同的组规范,根据规范,当三元组匹配图的约束时,将三元组分布到不同的图中。当服务后来尝试通过SEAS读取数据时,会检查会话并评估每个组的访问标准。如果用户有权访问该组,则允许服务从该组的图中读取数据。
当前栈包含一个三元组存储(Virtuoso、Blazegraph等)。由于我们要将mu-authorization放在该三元组存储前面,请在docker-compose.yml文件中查找三元组存储服务的名称,并将其重命名为triplestore。
例如:
ymlservices: database: image: tenforce/virtuoso ...
应更新为:
ymlservices: triplestore: image: tenforce/virtuoso ...
接下来,通过添加以下代码片段将mu-authorization服务添加到docker-compose.yml文件中:
ymlservices: database: image: semtech/mu-authorization:0.6.0-beta.5 environment: MU_SPARQL_ENDPOINT: "[***]" volumes: - ./config/authorization:/config
此片段通常添加在triplestore服务的正上方。
创建文件./config/authorization/config.ex,内容如下:
elixiralias Acl.Accessibility.Always, as: AlwaysAccessible alias Acl.GraphSpec.Constraint.Resource, as: ResourceConstraint alias Acl.GraphSpec, as: GraphSpec alias Acl.GroupSpec, as: GroupSpec alias Acl.GroupSpec.GraphCleanup, as: GraphCleanup defmodule Acl.UserGroups.Config do def user_groups do # 这些元素从上到下处理。每个元素可能会改变当前查询适用的四元组。四元组以三个部分表示:current_source_quads、removed_source_quads、new_quads。四元组可以通过多种方式计算。GroupSpec和GraphCleanup的使用很常见。 [ # // 公开 %GroupSpec{ name: "public", useage: [:read], access: %AlwaysAccessible{}, graphs: [ %GraphSpec{ graph: "[***]", constraint: %ResourceConstraint{ resource_types: [ ] } } ] }, # // 清理 # %GraphCleanup{ originating_graph: "[***]", useage: [:write], name: "clean" } ] end end
使用docker-compose up -d启动栈。授权服务将被创建。
请注意,在./config/authorization/config.ex中正确配置授权规则之前,应用程序中可能看不到任何数据。
本指南介绍如何为未认证用户(即会话中没有任何信息的用户)公开数据。
本指南假设已按照“教程:将mu-authorization添加到栈中”所述将mu-authorization添加到应用程序中,且数据当前存储在图[***]中。
首先,打开./config/authorization/config.ex,确保user_groups函数中有一个名为public的%GroupSpec,如下所示:
elixir%GroupSpec{ name: "public", useage: [:read], access: %AlwaysAccessible{}, graphs: [ %GraphSpec{ graph: "[***]", constraint: %ResourceConstraint{ resource_types: [ ] } } ] },
接下来,将要公开的所有资源类型(rdf:Class)添加到%ResourceConstraint的resource_types数组中。
例如:
elixir%GroupSpec{ name: "public", useage: [:read], access: %AlwaysAccessible{}, graphs: [ %GraphSpec{ graph: "[***]", constraint: %ResourceConstraint{ resource_types: [ "[***]", "[***]", "[***]" ] } } ] },
重启授权服务以应用更新的配置:
bashdocker-compose restart database
接下来,将数据库中的数据从图[***]移动到图[***]。如果栈包含mu-migrations-service,可以生成如下迁移:
sparqlDELETE { GRAPH <[***]> { ?s ?p ?o . } } INSERT { GRAPH <[***]> { ?s ?p ?o . } } WHERE { GRAPH <[***]> { ?s a ?type ; ?p ?o . VALUES ?type { <[***]> <[***]> <[***]> } } }
否则,可以直接在三元组存储的SPARQL端点(例如http://localhost:8890/sparql)上执行上述SPARQL查询。
现在数据已在三元组存储中移动,只需确保应用程序中的***用户与public组相关联。用户的默认组通过mu-identifier上的环境变量配置。
打开docker-compose.yml,将以下环境变量添加到identifier服务:
ymlservices: identifier: image: semtech/mu-identifier environment: DEFAULT_MU_AUTH_ALLOWED_GROUPS_HEADER: "[{\"variables\":[],\"name\":\"public\"}]"
使用docker-compose up -d重启栈。
现在应该能够在应用程序中检索指定资源类型的资源。
mu-authorization可以接收用户组配置和Delta系统的配置文件。
标准的mu-semtech栈确保配置文件存储在./config/authorization/中。可以通过在docker-compose.yml中添加以下卷将它们挂载到mu-authorization服务中:
ymlservices: database: image: semtech/mu-authorization volumes: - ./config/authorization:/config
配置文件的内容在授权配置和Delta系统部分有详细说明。
SEAS中的授权基于组访问规则。组基于对数据应用的约束对一个或多个图具有读和/或写访问权限。适用于用户的组访问规则基于其会话信息确定。
用户组应可在/config/user_groups.ex或/config/config.ex中访问。在标准的mu-semtech栈中,可能会将其保存在./config/authorization/user_groups.ex中。
SEAS配置文件中最重要的函数是user_groups函数。该函数返回SEAS已知的所有组配置。其返回类型的结构如下详细说明。
为使配置更简洁易读,可以在配置文件顶部配置以下别名:
elixiralias Acl.Accessibility.Always, as: AlwaysAccessible alias Acl.Accessibility.ByQuery, as: AccessByQuery alias Acl.GraphSpec.Constraint.Resource.AllPredicates, as: AllPredicates alias Acl.GraphSpec.Constraint.Resource.NoPredicates, as: NoPredicates alias Acl.GraphSpec.Constraint.ResourceFormat, as: ResourceFormatConstraint alias Acl.GraphSpec.Constraint.Resource, as: ResourceConstraint alias Acl.GraphSpec, as: GraphSpec alias Acl.GroupSpec, as: GroupSpec alias Acl.GroupSpec.GraphCleanup, as: GraphCleanup
user_groups函数的结果是GroupSpec对象的列表。每个此类对象指定一个组访问规则。
GroupSpec的属性包括:
:read、:write、:read_for_write。:read和:write含义明显,:read_for_write表示仅在执行更新查询时可以读取数据。值得注意的是,组访问规则与传统用户组并非一对一映射。相反,一个组访问规则可能适用于多个用户组。例如,一个组访问规则可能指定公司管理员的访问规则,但每个公司都有一个管理员用户组(例如“公司X的管理员”、“公司Y的管理员”等)。
访问规则确定用户是否符合组规范以及他属于哪些确切的用户组。
有两种访问规则:AlwaysAccessible和AccessByQuery。
AlwaysAccessible
一种简单的规则,允许所有用户访问,无论其会话信息如何。
AccessByQuery
根据特定SPARQL查询授予访问权限的规则。
AccessByQuery对象有两个属性:
<SESSION_ID>可用作SPARQL查询中的占位符,在运行时替换为当前会话的URI。SELECT块中返回的变量名称完全匹配。这些变量将被组访问规则的相应GraphSpecs使用。授予所有具有SuperMegaAdmin角色的用户访问权限的访问规则如下所示:
elixir%AccessByQuery{ vars: ["session_group_id","session_role"], query: "PREFIX ext: <[***]> PREFIX mu: <[***]> SELECT ?session_group ?session_role WHERE { <SESSION_ID> ext:sessionGroup/mu:uuid ?session_group_id; ext:sessionRole ?session_role. FILTER( ?session_role = \"SuperMegaAdmin\" ) } " }
确保正确转义查询中的特殊字符。
如果查询返回任何结果,则用户有权访问。对于每组返回的变量,解析一个图URI以在组访问规则的GraphSpecs部分中使用。
GraphSpec对象定义创建哪个图以及基于数据约束将哪些三元组添加到该图中。
每个GraphSpec对象包含以下属性:
GroupSpec的访问规则的vars属性的结果。例如,如果图URI是[***],访问规则的vars数组是['group_id', 'group_name'],则创建的图可能类似于[***]。GroupSpec对象的graphs属性包含GraphSpec对象的数组。即,组可访问的数据可能分布在多个图中。constraint属性定义三元组存储在哪个图中。
约束定义哪些三元组将被发送到图或从图读取。本节抽象了三元组是从图读取还是写入图,因为原理相同。这两种操作都称为“发送到图”。
有两种约束:ResourceFormatConstraint和ResourceConstraint。
ResourceFormatConstraint
ResourceFormatConstraint定义对三元组的主语URI格式的约束。它只有一个属性resource_prefix,包含一个URI。所有主语URI以此前缀开头的三元组将被发送到图。
在下面的示例中,所有主语以[***]开头的三元组将被发送到图[***]:
elixir%GraphSpec{ graph: "[***]", constraint: %ResourceFormatConstraint{ resource_prefix: "[***]" } }
ResourceConstraint
ResourceConstraint允许对资源的类型(rdf:Class)和/或三元组的谓词施加约束。
ResourceConstraint具有以下属性:
AllPredicates(默认)或NoPredicates对象,带有可选的except谓词URI数组。在第一个示例中,foaf:Person的属性不会被写入图[***],除了人的foaf:name和foaf:accountName。在第二个示例中,人的所有属性将被写入图[***],除了人的foaf:birthday:
elixir%GraphSpec{ graph: "[***]", constraint: %ResourceConstraint{ resource_types: [ "[***]" ], predicates: %NoPredicates{ except: [ "[***]", "[***]" ] } } }
elixir%GraphSpec{ graph: "[***]", constraint: %ResourceConstraint{ resource_types: [ "[***]" ], predicates: %AllPredicates{ except: [ "[***]" ] } } }
对于mu-authorization执行的每个更新查询,它都会计算增量,即添加了哪些三元组和删除了哪些三元组。这些增量消息可以发送给感兴趣的客户端。
该服务允许配置哪些客户端将接收这些增量消息。此文件需要在docker容器内的/config/delta.ex中可访问。
增量配置文件指定要向其发送增量消息的目标服务列表。可以在URL中使用docker服务名称(mu-authorization服务已知的名称)。
elixirdefmodule Delta.Config do def targets do [ "[***]" ] end end
目前,最常用的增量消息客户端是delta-notifier,它允许基于模式匹配将增量请求转发到其他服务。
增量消息的格式在delta-notifier的README中说明。
mu-authorization服务是放置在SPARQL端点前的层。该服务对SPARQL端点有一些假设,可以更改。可以配置三元组存储的位置以及支持特定三元组存储的修改。
mu-authorization发送SPARQL查询的默认SPARQL端点可以通过MU_SPARQL_ENDPOINT环境变量配置。在标准容器中运行时,默认配置为[***],但可以在docker-compose.yml文件中覆盖它。如果未设置此变量(如在标准开发设置中),将使用http://localhost:8890/sparql作为默认设置。
兼容性层可以重写SPARQL查询以符合三元组存储的预期。使用DATABASE_COMPATIBILITY环境变量。
有时三元组存储可能有些“挑剔”。mu-authorization尝试创建合理且有效的SPARQL查询来表达其意图。尽管仍在开发中,但其目标是生成清晰的SPARQL查询。三元组存储可能对某个查询报错,但对重写后的版本有效。兼容性层解决了这个问题。
DATABASE_COMPATIBILITY的

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务