Как использовать защищенные запросы в Apache Jena 3.10.0? - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать защищенный запрос в Apache Jena v.3.10.0.Я хочу передать какой-либо запрос, изменить запрос в соответствии с существующим SecurityEvaluator и выполнить его позже.

Однако я не понимаю, как его следует использовать с определенным форматом запросов.

Iпопытался сделать это, используя упрощенную версию 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}
}

, тогда все работает нормально, и «valididdenUri» проверяется на SecurityEvaluator и выдает org.apache.jena.shared.ReadDeniedException: нарушение прав модели.

Но что, если пользователь хочет выполнить что-то вроде этого:

select * where { graph ?g {?a ?b ?c}}

В этом случае мы можем проверить только URI «? G», который не очень информативен.Я понимаю, что AlgebraGenerator не заполняет недостающие места, так что это, вероятно, неправильный подход.Итак, как это можно сделать?Например, если пользователь хочет выполнить запрос ко многим именованным графам, как отфильтровать недопустимые?Возможно ли это вообще с существующими инструментами?

...