Added example code Added example.jar Added example fuseki configuration
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/0e135b58 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/0e135b58 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/0e135b58 Branch: refs/heads/master Commit: 0e135b58afd159487f9f156251582064a4104249 Parents: 51f169e Author: Claude Warren <[email protected]> Authored: Sat Jan 24 21:08:11 2015 +0000 Committer: Claude Warren <[email protected]> Committed: Sat Jan 24 21:08:11 2015 +0000 ---------------------------------------------------------------------- jena-security/pom.xml | 68 +++++++++ .../jena/security/example/ExampleEvaluator.java | 147 ++++++++++++++++++ .../jena/security/example/SecurityExample.java | 93 +++++++++++ .../security/example/ShiroExampleEvaluator.java | 153 +++++++++++++++++++ .../jena/security/example/ExampleEvaluator.java | 147 ------------------ .../jena/security/example/SecurityExample.java | 93 ----------- .../apache/jena/security/example/example.ttl | 49 ------ .../apache/jena/security/example/example.ttl | 49 ++++++ .../jena/security/example/fuseki/config.ttl | 82 ++++++++++ .../jena/security/example/fuseki/shiro.ini | 47 ++++++ .../apache/jena/security/query/DataSetTest.java | 4 +- .../jena/security/query/QueryEngineTest.java | 7 +- 12 files changed, 645 insertions(+), 294 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/pom.xml ---------------------------------------------------------------------- diff --git a/jena-security/pom.xml b/jena-security/pom.xml index 0b4bd80..7632b64 100644 --- a/jena-security/pom.xml +++ b/jena-security/pom.xml @@ -62,10 +62,45 @@ <build> <plugins> <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.9.1</version> + <executions> + <execution> + <id>add-example-source</id> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>src/example/java</source> + </sources> + </configuration> + </execution> + <execution> + <id>add-example-resource</id> + <phase>generate-sources</phase> + <goals> + <goal>add-resource</goal> + </goals> + <configuration> + <resources> + <resource> + <directory>src/example/resources</directory> + <targetPath>${project.build.outputDirectory}</targetPath> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <!-- <version>2.9</version> --> <configuration> + <excludePackageNames>org.apache.jena.security.example:org.apache.jena.security.example.*</excludePackageNames> <tags> <tag> <name>sec.graph</name> @@ -81,6 +116,7 @@ </tag> </tags> <overview>${basedir}/src/main/overview.html</overview> + </configuration> <executions> <execution> @@ -94,12 +130,38 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> + <configuration> + <excludes> + <exclude>org/apache/jena/security/example/**</exclude> + </excludes> + </configuration> <executions> <execution> + <id>create-test-jar</id> <goals> <goal>test-jar</goal> </goals> </execution> + <execution> + <id>create-example-jar</id> + <phase>package</phase> + <goals> + <goal>jar</goal> + </goals> + <configuration> + <classedDirectory>target</classedDirectory> + <classifier>example</classifier> + <includes> + <include>../src/example/**</include> + <include>../src/example</include> + <include>META-INF/**</include> + <include>org/apache/jena/security/example/**</include> + </includes> + <excludes> + <exclude>META-INF/DEPENDENCIES</exclude> + </excludes> + </configuration> + </execution> </executions> </plugin> </plugins> @@ -131,5 +193,11 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-core</artifactId> + <version>1.2.2</version> + <scope>provided</scope> + </dependency> </dependencies> </project> http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/java/org/apache/jena/security/example/ExampleEvaluator.java ---------------------------------------------------------------------- diff --git a/jena-security/src/example/java/org/apache/jena/security/example/ExampleEvaluator.java b/jena-security/src/example/java/org/apache/jena/security/example/ExampleEvaluator.java new file mode 100644 index 0000000..2ec4cb0 --- /dev/null +++ b/jena-security/src/example/java/org/apache/jena/security/example/ExampleEvaluator.java @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jena.security.example; + +import java.security.Principal; +import java.util.Set; + +import org.apache.http.auth.BasicUserPrincipal; +import org.apache.jena.security.SecurityEvaluator; + +import com.hp.hpl.jena.graph.NodeFactory; +import com.hp.hpl.jena.rdf.model.AnonId; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.vocabulary.RDF; + +/** + * An example evaluator that only provides access to messages in the graph that + * are from or to the principal. + * + */ +public class ExampleEvaluator implements SecurityEvaluator { + + private Principal principal; + private Model model; + private RDFNode msgType = ResourceFactory.createResource( "http://example.com/msg" ); + private Property pTo = ResourceFactory.createProperty( "http://example.com/to" ); + private Property pFrom = ResourceFactory.createProperty( "http://example.com/from" ); + + /** + * + * @param model The graph we are going to evaluate against. + */ + public ExampleEvaluator( Model model ) + { + this.model = model; + } + + @Override + public boolean evaluate(Object principal, Action action, SecNode graphIRI) { + // we allow any action on a graph. + return true; + } + + private boolean evaluate( Object principalObj, Resource r ) + { + Principal principal = (Principal)principalObj; + // a message is only available to sender or recipient + if (r.hasProperty( RDF.type, msgType )) + { + return r.hasProperty( pTo, principal.getName() ) || + r.hasProperty( pFrom, principal.getName()); + } + return true; + } + + private boolean evaluate( Object principal, SecNode node ) + { + if (node.equals( SecNode.ANY )) { + return false; // all wild cards are false + } + + if (node.getType().equals( SecNode.Type.URI)) { + Resource r = model.createResource( node.getValue() ); + return evaluate( principal, r ); + } + else if (node.getType().equals( SecNode.Type.Anonymous)) { + Resource r = model.getRDFNode( NodeFactory.createAnon( new AnonId( node.getValue()) ) ).asResource(); + return evaluate( principal, r ); + } + else + { + return true; + } + + } + + private boolean evaluate( Object principal, SecTriple triple ) { + return evaluate( principal, triple.getSubject()) && + evaluate( principal, triple.getObject()) && + evaluate( principal, triple.getPredicate()); + } + + @Override + public boolean evaluate(Object principal, Action action, SecNode graphIRI, SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluate(Object principal, Set<Action> actions, SecNode graphIRI) { + return true; + } + + @Override + public boolean evaluate(Object principal, Set<Action> actions, SecNode graphIRI, + SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluateAny(Object principal, Set<Action> actions, SecNode graphIRI) { + return true; + } + + @Override + public boolean evaluateAny(Object principal, Set<Action> actions, SecNode graphIRI, + SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluateUpdate(Object principal, SecNode graphIRI, SecTriple from, SecTriple to) { + return evaluate( principal, from ) && evaluate( principal, to ); + } + + public void setPrincipal( String userName ) + { + if (userName == null) + { + principal = null; + } + principal = new BasicUserPrincipal( userName ); + } + @Override + public Principal getPrincipal() { + return principal; + } + +} http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/java/org/apache/jena/security/example/SecurityExample.java ---------------------------------------------------------------------- diff --git a/jena-security/src/example/java/org/apache/jena/security/example/SecurityExample.java b/jena-security/src/example/java/org/apache/jena/security/example/SecurityExample.java new file mode 100644 index 0000000..9a8ae36 --- /dev/null +++ b/jena-security/src/example/java/org/apache/jena/security/example/SecurityExample.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jena.security.example; + +import java.net.URL; + +import org.apache.jena.security.Factory; + +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.ResIterator; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.vocabulary.RDF; + +public class SecurityExample { + + /** + * @param args + */ + + public static void main(String[] args) { + String[] names = { "alice", "bob", "chuck", "darla" }; + + RDFNode msgType = ResourceFactory + .createResource("http://example.com/msg"); + Property pTo = ResourceFactory.createProperty("http://example.com/to"); + Property pFrom = ResourceFactory + .createProperty("http://example.com/from"); + Property pSubj = ResourceFactory + .createProperty("http://example.com/subj"); + + Model model = ModelFactory.createDefaultModel(); + URL url = SecurityExample.class.getClassLoader().getResource( + "org/apache/jena/security/example/example.ttl"); + model.read(url.toExternalForm()); + ResIterator ri = model.listSubjectsWithProperty(RDF.type, msgType); + System.out.println("All the messages"); + while (ri.hasNext()) { + Resource msg = ri.next(); + Statement to = msg.getProperty(pTo); + Statement from = msg.getProperty(pFrom); + Statement subj = msg.getProperty(pSubj); + System.out.println(String.format("%s to: %s from: %s subj: %s", + msg, to.getObject(), from.getObject(), subj.getObject())); + } + System.out.println(); + + ExampleEvaluator evaluator = new ExampleEvaluator(model); + model = Factory.getInstance(evaluator, + "http://example.com/SecuredModel", model); + for (String userName : names) { + evaluator.setPrincipal(userName); + + System.out.println("Messages " + userName + " can manipulate"); + ri = model.listSubjectsWithProperty(RDF.type, msgType); + while (ri.hasNext()) { + Resource msg = ri.next(); + Statement to = msg.getProperty(pTo); + Statement from = msg.getProperty(pFrom); + Statement subj = msg.getProperty(pSubj); + System.out.println(String.format( + "%s to: %s from: %s subj: %s", msg, to.getObject(), + from.getObject(), subj.getObject())); + } + ri.close(); + for (String name : names) + { + System.out.println( String.format( "%s messages to %s", model.listSubjectsWithProperty( pTo, name ).toList().size(), name ) ); + } + System.out.println(); + } + } + +} http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/java/org/apache/jena/security/example/ShiroExampleEvaluator.java ---------------------------------------------------------------------- diff --git a/jena-security/src/example/java/org/apache/jena/security/example/ShiroExampleEvaluator.java b/jena-security/src/example/java/org/apache/jena/security/example/ShiroExampleEvaluator.java new file mode 100644 index 0000000..87fca4e --- /dev/null +++ b/jena-security/src/example/java/org/apache/jena/security/example/ShiroExampleEvaluator.java @@ -0,0 +1,153 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jena.security.example; + +import java.util.Set; + +import org.apache.jena.security.SecurityEvaluator; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.hp.hpl.jena.graph.NodeFactory; +import com.hp.hpl.jena.rdf.model.AnonId; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.vocabulary.RDF; + +/** + * Class to use Shiro to provide credentials. + * Used for same example as ExampleEvaluator + * + */ +public class ShiroExampleEvaluator implements SecurityEvaluator { + + private static final Logger LOG = LoggerFactory.getLogger(ShiroExampleEvaluator.class); + private Model model; + private RDFNode msgType = ResourceFactory.createResource( "http://example.com/msg" ); + private Property pTo = ResourceFactory.createProperty( "http://example.com/to" ); + private Property pFrom = ResourceFactory.createProperty( "http://example.com/from" ); + + /** + * + * @param model The graph we are going to evaluate against. + */ + public ShiroExampleEvaluator( Model model ) + { + this.model = model; + } + + @Override + public boolean evaluate(Object principal, Action action, SecNode graphIRI) { + // we allow any action on a graph. + return true; + } + + private boolean evaluate( Object principalObj, Resource r ) + { + Subject subject = (Subject)principalObj; + if (! subject.isAuthenticated()) + { + LOG.info( "User not authenticated"); + return false; + } + // a message is only available to sender or recipient + LOG.debug( "checking {}", subject.getPrincipal()); + Object principal = subject.getPrincipal(); + if ("admin".equals(principal.toString())) + { + return true; + } + if (r.hasProperty( RDF.type, msgType )) + { + return r.hasProperty( pTo, subject.getPrincipal().toString() ) || + r.hasProperty( pFrom, subject.getPrincipal().toString()); + } + return true; + } + + private boolean evaluate( Object principal, SecNode node ) + { + if (node.equals( SecNode.ANY )) { + return false; // all wild cards are false + } + + if (node.getType().equals( SecNode.Type.URI)) { + Resource r = model.createResource( node.getValue() ); + return evaluate( principal, r ); + } + else if (node.getType().equals( SecNode.Type.Anonymous)) { + Resource r = model.getRDFNode( NodeFactory.createAnon( new AnonId( node.getValue()) ) ).asResource(); + return evaluate( principal, r ); + } + else + { + return true; + } + + } + + private boolean evaluate( Object principal, SecTriple triple ) { + return evaluate( principal, triple.getSubject()) && + evaluate( principal, triple.getObject()) && + evaluate( principal, triple.getPredicate()); + } + + @Override + public boolean evaluate(Object principal, Action action, SecNode graphIRI, SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluate(Object principal, Set<Action> actions, SecNode graphIRI) { + return true; + } + + @Override + public boolean evaluate(Object principal, Set<Action> actions, SecNode graphIRI, + SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluateAny(Object principal, Set<Action> actions, SecNode graphIRI) { + return true; + } + + @Override + public boolean evaluateAny(Object principal, Set<Action> actions, SecNode graphIRI, + SecTriple triple) { + return evaluate( principal, triple ); + } + + @Override + public boolean evaluateUpdate(Object principal, SecNode graphIRI, SecTriple from, SecTriple to) { + return evaluate( principal, from ) && evaluate( principal, to ); + } + + @Override + public Object getPrincipal() { + return SecurityUtils.getSubject(); + } + + +} http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/org/apache/jena/security/example/ExampleEvaluator.java ---------------------------------------------------------------------- diff --git a/jena-security/src/example/org/apache/jena/security/example/ExampleEvaluator.java b/jena-security/src/example/org/apache/jena/security/example/ExampleEvaluator.java deleted file mode 100644 index 9a1831a..0000000 --- a/jena-security/src/example/org/apache/jena/security/example/ExampleEvaluator.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.jena.security.example; - -import java.security.Principal; -import java.util.Set; - -import org.apache.http.auth.BasicUserPrincipal; -import org.apache.jena.security.SecurityEvaluator; - -import com.hp.hpl.jena.graph.Node; -import com.hp.hpl.jena.graph.NodeFactory; -import com.hp.hpl.jena.rdf.model.AnonId; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.Property; -import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.Resource; -import com.hp.hpl.jena.rdf.model.ResourceFactory; -import com.hp.hpl.jena.vocabulary.RDF; - -/** - * An example evaluator that only provides access ot messages in the graph that - * are from or to the principal. - * - */ -public class ExampleEvaluator implements SecurityEvaluator { - - private Principal principal; - private Model model; - private RDFNode msgType = ResourceFactory.createResource( "http://example.com/msg" ); - private Property pTo = ResourceFactory.createProperty( "http://example.com/to" ); - private Property pFrom = ResourceFactory.createProperty( "http://example.com/from" ); - - /** - * - * @param model The graph we are going to evaluate against. - */ - public ExampleEvaluator( Model model ) - { - this.model = model; - } - - @Override - public boolean evaluate(Action action, SecNode graphIRI) { - // we allow any action on a graph. - return true; - } - - private boolean evaluate( Resource r ) - { - // a message is only available to sender or recipient - if (r.hasProperty( RDF.type, msgType )) - { - return r.hasProperty( pTo, principal.getName() ) || - r.hasProperty( pFrom, principal.getName()); - } - return true; - } - - private boolean evaluate( SecNode node ) - { - if (node.equals( SecNode.ANY )) { - return false; // all wild cards are false - } - - if (node.getType().equals( SecNode.Type.URI)) { - Resource r = model.createResource( node.getValue() ); - return evaluate( r ); - } - else if (node.getType().equals( SecNode.Type.Anonymous)) { - Resource r = model.getRDFNode( NodeFactory.createAnon( new AnonId( node.getValue()) ) ).asResource(); - return evaluate( r ); - } - else - { - return true; - } - - } - - private boolean evaluate( SecTriple triple ) { - return evaluate( triple.getSubject()) && - evaluate( triple.getObject()) && - evaluate( triple.getPredicate()); - } - - @Override - public boolean evaluate(Action action, SecNode graphIRI, SecTriple triple) { - return evaluate( triple ); - } - - @Override - public boolean evaluate(Set<Action> actions, SecNode graphIRI) { - return true; - } - - @Override - public boolean evaluate(Set<Action> actions, SecNode graphIRI, - SecTriple triple) { - return evaluate( triple ); - } - - @Override - public boolean evaluateAny(Set<Action> actions, SecNode graphIRI) { - return true; - } - - @Override - public boolean evaluateAny(Set<Action> actions, SecNode graphIRI, - SecTriple triple) { - return evaluate( triple ); - } - - @Override - public boolean evaluateUpdate(SecNode graphIRI, SecTriple from, SecTriple to) { - return evaluate( from ) && evaluate( to ); - } - - public void setPrincipal( String userName ) - { - if (userName == null) - { - principal = null; - } - principal = new BasicUserPrincipal( userName ); - } - @Override - public Principal getPrincipal() { - return principal; - } - -} http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/org/apache/jena/security/example/SecurityExample.java ---------------------------------------------------------------------- diff --git a/jena-security/src/example/org/apache/jena/security/example/SecurityExample.java b/jena-security/src/example/org/apache/jena/security/example/SecurityExample.java deleted file mode 100644 index 9a8ae36..0000000 --- a/jena-security/src/example/org/apache/jena/security/example/SecurityExample.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.jena.security.example; - -import java.net.URL; - -import org.apache.jena.security.Factory; - -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.rdf.model.Property; -import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.ResIterator; -import com.hp.hpl.jena.rdf.model.Resource; -import com.hp.hpl.jena.rdf.model.ResourceFactory; -import com.hp.hpl.jena.rdf.model.Statement; -import com.hp.hpl.jena.vocabulary.RDF; - -public class SecurityExample { - - /** - * @param args - */ - - public static void main(String[] args) { - String[] names = { "alice", "bob", "chuck", "darla" }; - - RDFNode msgType = ResourceFactory - .createResource("http://example.com/msg"); - Property pTo = ResourceFactory.createProperty("http://example.com/to"); - Property pFrom = ResourceFactory - .createProperty("http://example.com/from"); - Property pSubj = ResourceFactory - .createProperty("http://example.com/subj"); - - Model model = ModelFactory.createDefaultModel(); - URL url = SecurityExample.class.getClassLoader().getResource( - "org/apache/jena/security/example/example.ttl"); - model.read(url.toExternalForm()); - ResIterator ri = model.listSubjectsWithProperty(RDF.type, msgType); - System.out.println("All the messages"); - while (ri.hasNext()) { - Resource msg = ri.next(); - Statement to = msg.getProperty(pTo); - Statement from = msg.getProperty(pFrom); - Statement subj = msg.getProperty(pSubj); - System.out.println(String.format("%s to: %s from: %s subj: %s", - msg, to.getObject(), from.getObject(), subj.getObject())); - } - System.out.println(); - - ExampleEvaluator evaluator = new ExampleEvaluator(model); - model = Factory.getInstance(evaluator, - "http://example.com/SecuredModel", model); - for (String userName : names) { - evaluator.setPrincipal(userName); - - System.out.println("Messages " + userName + " can manipulate"); - ri = model.listSubjectsWithProperty(RDF.type, msgType); - while (ri.hasNext()) { - Resource msg = ri.next(); - Statement to = msg.getProperty(pTo); - Statement from = msg.getProperty(pFrom); - Statement subj = msg.getProperty(pSubj); - System.out.println(String.format( - "%s to: %s from: %s subj: %s", msg, to.getObject(), - from.getObject(), subj.getObject())); - } - ri.close(); - for (String name : names) - { - System.out.println( String.format( "%s messages to %s", model.listSubjectsWithProperty( pTo, name ).toList().size(), name ) ); - } - System.out.println(); - } - } - -} http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/org/apache/jena/security/example/example.ttl ---------------------------------------------------------------------- diff --git a/jena-security/src/example/org/apache/jena/security/example/example.ttl b/jena-security/src/example/org/apache/jena/security/example/example.ttl deleted file mode 100644 index 7047629..0000000 --- a/jena-security/src/example/org/apache/jena/security/example/example.ttl +++ /dev/null @@ -1,49 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -@prefix ex: <http://example.com/> . -@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . - -ex:msg1 rdf:type ex:msg; - ex:to "bob"; - ex:from "alice" ; - ex:subj "alice to bob 1"; - . - -ex:msg2 rdf:type ex:msg; - ex:to "alice"; - ex:from "bob"; - ex:subj "bob to alice 1"; - . - -ex:msg3 rdf:type ex:msg; - ex:to "chuck" ; - ex:from "alice"; - ex:subj "alice to chuck 1"; - . - -ex:msg4 rdf:type ex:msg; - ex:to "darla" ; - ex:from "bob" ; - ex:subj "bob to darla 1" - . - -ex:msg5 rdf:type ex:msg; - ex:to "alice"; - ex:from "bob"; - ex:subj "bob to alice 2"; - . - \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/resources/org/apache/jena/security/example/example.ttl ---------------------------------------------------------------------- diff --git a/jena-security/src/example/resources/org/apache/jena/security/example/example.ttl b/jena-security/src/example/resources/org/apache/jena/security/example/example.ttl new file mode 100644 index 0000000..7047629 --- /dev/null +++ b/jena-security/src/example/resources/org/apache/jena/security/example/example.ttl @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +@prefix ex: <http://example.com/> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . + +ex:msg1 rdf:type ex:msg; + ex:to "bob"; + ex:from "alice" ; + ex:subj "alice to bob 1"; + . + +ex:msg2 rdf:type ex:msg; + ex:to "alice"; + ex:from "bob"; + ex:subj "bob to alice 1"; + . + +ex:msg3 rdf:type ex:msg; + ex:to "chuck" ; + ex:from "alice"; + ex:subj "alice to chuck 1"; + . + +ex:msg4 rdf:type ex:msg; + ex:to "darla" ; + ex:from "bob" ; + ex:subj "bob to darla 1" + . + +ex:msg5 rdf:type ex:msg; + ex:to "alice"; + ex:from "bob"; + ex:subj "bob to alice 2"; + . + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/config.ttl ---------------------------------------------------------------------- diff --git a/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/config.ttl b/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/config.ttl new file mode 100644 index 0000000..6f4a3af --- /dev/null +++ b/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/config.ttl @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +@prefix fuseki: <http://jena.apache.org/fuseki#> . +@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> . +@prefix sec: <http://apache.org/jena/security/Assembler#> . +@prefix my: <http://example.org/#> . + +#[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" . +[] ja:loadClass "org.apache.jena.security.SecuredAssembler" . + +tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset . +tdb:GraphTDB rdfs:subClassOf ja:Model . +sec:Model rdfs:subClassOf ja:NamedModel . + +my:dataset rdf:type tdb:DatasetTDB; + tdb:location "/tmp/myApp" ; + tdb:unionDefaultGraph true ; + . + +my:baseModel rdf:type tdb:GraphTDB ; + tdb:dataset my:dataset . + +my:securedModel rdf:type sec:Model ; + sec:baseModel my:baseModel ; + ja:modelName "https://example.org/securedModel" ; + sec:evaluatorImpl my:secEvaluator . + +my:secEvaluator rdf:type sec:Evaluator ; + sec:args [ + rdf:_1 my:baseModel ; + ] ; + sec:evaluatorClass "org.apache.jena.security.example.ShiroExampleEvaluator" . + +my:securedDataset rdf:type ja:RDFDataset ; + ja:defaultGraph my:securedModel . + +my:fuseki rdf:type fuseki:Server ; + # Server-wide context parameters can be given here. + # For example, to set query timeouts: on a server-wide basis: + # Format 1: "1000" -- 1 second timeout + # Format 2: "10000,60000" -- 10s timeout to first result, then 60s timeout to for rest of query. + # See java doc for ARQ.queryTimeout + # ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "10000" ] ; + + # Load custom code (rarely needed) + # ja:loadClass "your.code.Class" ; + + # Services available. Only explicitly listed services are configured. + # If there is a service description not linked from this list, it is ignored. + fuseki:services ( + my:service1 + ) . + + +my:service1 rdf:type fuseki:Service ; + fuseki:name "myAppFuseki" ; # http://host:port/myAppFuseki + fuseki:serviceQuery "query" ; # SPARQL query service + fuseki:serviceQuery "sparql" ; # SPARQL query service + fuseki:serviceUpdate "update" ; # SPARQL query service + fuseki:serviceUpload "upload" ; # Non-SPARQL upload service + fuseki:serviceReadWriteGraphStore "data" ; # SPARQL Graph store protocol (read and write) + # A separate ead-only graph store endpoint: + fuseki:serviceReadGraphStore "get" ; # SPARQL Graph store protocol (read only) + fuseki:dataset my:securedDataset ; + . http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/shiro.ini ---------------------------------------------------------------------- diff --git a/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/shiro.ini b/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/shiro.ini new file mode 100644 index 0000000..d0ce2c3 --- /dev/null +++ b/jena-security/src/example/resources/org/apache/jena/security/example/fuseki/shiro.ini @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[main] +# Development +ssl.enabled = false + +plainMatcher=org.apache.shiro.authc.credential.SimpleCredentialsMatcher +#iniRealm=org.apache.shiro.realm.text.IniRealm +iniRealm.credentialsMatcher = $plainMatcher + +localhost=org.apache.jena.fuseki.authz.LocalhostFilter + +[users] +# Implicitly adds "iniRealm = org.apache.shiro.realm.text.IniRealm" +admin=admin +alice=alice +bob=bob +chuck=chuck +darla=darla + +[roles] + +[urls] +## Control functions open to anyone +/$/status = anon +/$/ping = anon + +## restrict access. Must log in with above. +/$/** = authcBasic,user[admin] + + +# Everything else +/**=anon http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/test/java/org/apache/jena/security/query/DataSetTest.java ---------------------------------------------------------------------- diff --git a/jena-security/src/test/java/org/apache/jena/security/query/DataSetTest.java b/jena-security/src/test/java/org/apache/jena/security/query/DataSetTest.java index 51f3080..ef4bf93 100644 --- a/jena-security/src/test/java/org/apache/jena/security/query/DataSetTest.java +++ b/jena-security/src/test/java/org/apache/jena/security/query/DataSetTest.java @@ -209,7 +209,7 @@ public class DataSetTest { { count++; final QuerySolution soln = results.nextSolution(); - System.out.println( soln ); + //System.out.println( soln ); } // 2x 3 values + type triple Assert.assertEquals(8, count); @@ -231,7 +231,7 @@ public class DataSetTest { { count++; final QuerySolution soln = results.nextSolution(); - System.out.println( soln ); + //System.out.println( soln ); } // 2x 3 values + type triple // all are in the base graph so no named graphs http://git-wip-us.apache.org/repos/asf/jena/blob/0e135b58/jena-security/src/test/java/org/apache/jena/security/query/QueryEngineTest.java ---------------------------------------------------------------------- diff --git a/jena-security/src/test/java/org/apache/jena/security/query/QueryEngineTest.java b/jena-security/src/test/java/org/apache/jena/security/query/QueryEngineTest.java index a27e4f6..97da8fa 100644 --- a/jena-security/src/test/java/org/apache/jena/security/query/QueryEngineTest.java +++ b/jena-security/src/test/java/org/apache/jena/security/query/QueryEngineTest.java @@ -219,7 +219,7 @@ public class QueryEngineTest { { count++; final QuerySolution soln = results.nextSolution(); - System.out.println( soln ); + //System.out.println( soln ); } // 2x 3 values + type triple Assert.assertEquals(8, count); @@ -241,10 +241,11 @@ public class QueryEngineTest { { count++; final QuerySolution soln = results.nextSolution(); - System.out.println( soln ); + //System.out.println( soln ); } // 2x 3 values + type triple - Assert.assertEquals(8, count); + // no named graphs so no results. + Assert.assertEquals(0, count); } finally {
