如何在Apache Jena 3.10.0中使用安全查询?

时间:2019-03-28 15:41:01

标签: sparql jena

我正在尝试在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不会填补缺失的位置,因此这可能是错误的方法。 那么,该怎么办呢?例如,如果用户想对许多命名图运行查询,如何过滤不允许的图?现有工具有可能吗?

0 个答案:

没有答案