我正在尝试在Apache Jena v.3.10.0中构建安全查询。 我想传递一些查询,根据现有的SecurityEvaluator修改查询,然后再执行。
但是,我不明白在某些格式的查询中应如何使用它。
我尝试使用SecuredQueryEngine的简化版本来做到这一点。
public class GenSecuredEngine extends QueryEngineMain {
private static Logger LOG = LoggerFactory
.getLogger(SecuredQueryEngine.class);
private SecurityEvaluator securityEvaluator;
private Node graphIRI;
public GenSecuredEngine(final Query query, final DatasetGraph dataset,
final SecurityEvaluator evaluator,
final Binding input, final Context context) {
super(query, dataset, input, context);
this.securityEvaluator = evaluator;
graphIRI = NodeFactory.createURI("urn:x-arq:DefaultGraph");
}
@Override
protected Op modifyOp(final Op op) {
final OpRewriter rewriter = new OpRewriter(securityEvaluator, graphIRI);
LOG.debug("Before: {}", op);
op.visit(rewriter);
Op result = rewriter.getResult();
result = result == null ? op : result;
LOG.debug("After: {}", result);
result = super.modifyOp(result);
LOG.debug("After Optimize: {}", result);
return result;
}
}
然后,我们有这样的代码将给定的查询修改为Op,检查权限并构建新的Op对象。
Op oporiginal = new AlgebraGenerator().compile(query);
Op result = securedEngine.modifyOp(oporiginal);
System.out.println(OpAsQuery.asQuery(result));
如果我通过这样的查询
select *
where {
graph <forbiddenGraphUri> {?a ?b ?c}
}
然后一切正常,并针对SecurityEvaluator检查“ forbiddenUri”,并抛出org.apache.jena.shared.ReadDeniedException:模型权限冲突。
但是,如果用户想要执行以下操作:
select * where { graph ?g {?a ?b ?c}}
在这种情况下,我们只能检查“?g”的URI,但它实际上并不能提供足够的信息。我了解AlgebraGenerator不会填补缺失的位置,因此这可能是错误的方法。 那么,该怎么办呢?例如,如果用户想对许多命名图运行查询,如何过滤不允许的图?现有工具有可能吗?