您的问题中提供的信息很少。我将尝试回答并尝试确定我所做的假设。
我使用术语“基本图”来表示您正在查询的图。这可能是多个物理图的组合。它是包含将被查询并返回给用户的数据的图。
我使用术语“安全图”来表示存储有关安全访问的数据的图。
首先,我假设您有一种将登录用户与用户有权访问的角色相关联的机制。这可能是用户的角色列表,或者如果用户具有特定角色,则返回 true 的方法。除了实现细节之外,还有一种方法可以确定用户是否具有角色。
其次,我从您的问题中假设您要检查基础图中的每个三元组,并且每个三元组的具体化都存储在“安全图”中。这意味着您的安全图将比您的数据图大得多。如果您只对限制对具有谓词 dbo:capital 的三元组的访问感兴趣,那么创建一个具有 dbr:country 的新类型可能会更好,哪些组可以访问该国家/地区。但是现在我将继续假设您将使用角色属性创建具体化语句,并且您将为您有兴趣限制的每个三元组执行此操作。
“安全图”必须可以从 SecurityEvaluator 中访问(这是设置评估器的一部分)。
第三个假设,数据图由图名“urn:graph-name:data-graph”标识。
当从“urn:graph-name:data-graph”中读取三元组 <dbr:Ireland, dbo:capital, dbo:Dublin>
方法 SecurityEvaluator.evaluate(Acton.Read, "urn:graph-name:data-graph" ) 将首先被调用。Evaluator 应返回“true”以指示用户具有对图形的读取权限。
其次,将调用 SecurityEvaluator.evaluate(Action.Read, "urn:graph-name:data-graph", SecTriple.ANY) 方法。SecurityEvaluator 应返回“false”以指示数据图中的某些三元组存在限制。如果您的角色可以读取所有数据元素,您可以在此处为具有该角色的用户返回“true”。
最后将调用方法 SecurityEvaluator.evaluate(Action.Read, "urn:graph-name:data-graph", <dbr:Ireland, dbo:capital, dbo:Dublin> )。然后,评估者应查找覆盖 <dbr:Ireland, dbo:capital, dbo:Dublin> 三元组的 rdf:Statement,检索有权访问的角色,将这些角色与用户拥有的角色进行比较,以及是否存在交叉点返回“真”,否则返回“假”。
有几点需要考虑:
安全/权限系统通常关注对对象特定属性的访问,研究如何使用角色存储这些属性通常会减小“安全图”的大小,并使系统更有效率。
使用具体化来识别需要过滤的三元组意味着如果有人添加一个新的三元组say <dbr:Ireland, dbo:capital, "Dublin"> 三元组不会被阻止。
如果三元组 <dbr:Ireland, dbo:capital, dbo:Dublin> 存在于 2 个图形中,它们组合成一个数据集,并且您只过滤数据会喜欢的一个图形。这是故意的。
在本次讨论中,我使用了术语“安全图”。我这样做是因为您的示例使用具体三元组来描述数据。不需要使用图表来存储安全限制。这样做通常更容易,因为图形操作代码已经在手边,但这不是必需的。任何允许您查找三元组的受限组件的解决方案都可以使用。
我希望这有帮助。