You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2019/07/15 06:41:30 UTC
[camel] branch camel-2.x updated: CAMEL-13747: Added basic auth
support to camel-solr
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch camel-2.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-2.x by this push:
new d523a9f CAMEL-13747: Added basic auth support to camel-solr
d523a9f is described below
commit d523a9fca3613054f9585a19bac6d5f194566ad7
Author: Soner Koksal <so...@arvato.com>
AuthorDate: Thu Jul 11 16:14:20 2019 +0300
CAMEL-13747: Added basic auth support to camel-solr
---
.../camel-solr/src/main/docs/solr-component.adoc | 4 +-
.../apache/camel/component/solr/SolrEndpoint.java | 26 ++++++++++++
.../apache/camel/component/solr/SolrProducer.java | 47 +++++++++++++++++-----
.../camel/component/solr/InitSolrEndpointTest.java | 3 +-
.../component/solr/SolrComponentTestSupport.java | 5 ++-
.../apache/camel/component/solr/SolrFixtures.java | 26 +++++++-----
.../src/test/resources/solr/security.json | 13 ++++++
7 files changed, 99 insertions(+), 25 deletions(-)
diff --git a/components/camel-solr/src/main/docs/solr-component.adoc b/components/camel-solr/src/main/docs/solr-component.adoc
index 453836e..4e67e14 100644
--- a/components/camel-solr/src/main/docs/solr-component.adoc
+++ b/components/camel-solr/src/main/docs/solr-component.adoc
@@ -59,7 +59,7 @@ with the following path and query parameters:
|===
-==== Query Parameters (13 parameters):
+==== Query Parameters (15 parameters):
[width="100%",cols="2,5,^1,2",options="header"]
@@ -76,6 +76,8 @@ with the following path and query parameters:
| *streamingQueueSize* (producer) | Set the queue size for the StreamingUpdateSolrServer | 10 | int
| *streamingThreadCount* (producer) | Set the number of threads for the StreamingUpdateSolrServer | 2 | int
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *password* (security) | Sets password for basic auth plugin enabled servers | | String
+| *username* (security) | Sets username for basic auth plugin enabled servers | | String
| *collection* (solrCloud) | Set the collection name which the solrCloud server could use | | String
| *zkHost* (solrCloud) | Set the ZooKeeper host information which the solrCloud could use, such as zkhost=localhost:8123. | | String
|===
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
index 57cbeb2..4abc62d 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
@@ -67,6 +67,10 @@ public class SolrEndpoint extends DefaultEndpoint {
private String collection;
@UriParam
private String requestHandler;
+ @UriParam(label = "security", secret = true)
+ private String username;
+ @UriParam(label = "security", secret = true)
+ private String password;
public SolrEndpoint(String endpointUri, SolrComponent component, String address) throws Exception {
super(endpointUri, component);
@@ -278,4 +282,26 @@ public class SolrEndpoint extends DefaultEndpoint {
this.allowCompression = allowCompression;
}
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Sets username for basic auth plugin enabled servers
+ */
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets password for basic auth plugin enabled servers
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
index 2a662d6..97c24d9 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
@@ -20,7 +20,7 @@ import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-
+import java.util.stream.Collectors;
import javax.activation.MimetypesFileTypeMap;
import org.apache.camel.Exchange;
@@ -28,6 +28,7 @@ import org.apache.camel.WrappedFile;
import org.apache.camel.impl.DefaultProducer;
import org.apache.camel.util.ObjectHelper;
import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.request.DirectXmlRequest;
import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -76,19 +77,34 @@ public class SolrProducer extends DefaultProducer {
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_INSERT_STREAMING)) {
insert(exchange, serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_ID)) {
- serverToUse.deleteById(exchange.getIn().getBody(String.class));
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.deleteById(exchange.getIn().getBody(String.class));
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_QUERY)) {
- serverToUse.deleteByQuery(exchange.getIn().getBody(String.class));
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.deleteByQuery(exchange.getIn().getBody(String.class));
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEAN)) {
- serverToUse.addBean(exchange.getIn().getBody());
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.add(serverToUse.getBinder().toSolrInputDocument(exchange.getIn().getBody()));
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEANS)) {
- serverToUse.addBeans(exchange.getIn().getBody(Collection.class));
+ UpdateRequest updateRequest = createUpdateRequest();
+ Collection<Object> body = exchange.getIn().getBody(Collection.class);
+ updateRequest.add(body.stream().map(serverToUse.getBinder()::toSolrInputDocument).collect(Collectors.toList()));
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_COMMIT)) {
- serverToUse.commit();
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.setAction(ACTION.COMMIT, true, true);
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ROLLBACK)) {
- serverToUse.rollback();
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.rollback();
+ updateRequest.process(serverToUse);
} else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_OPTIMIZE)) {
- serverToUse.optimize();
+ UpdateRequest updateRequest = createUpdateRequest();
+ updateRequest.setAction(ACTION.OPTIMIZE, true, true, 1);
+ updateRequest.process(serverToUse);
} else {
throw new IllegalArgumentException(
SolrConstants.OPERATION + " header value '" + operation + "' is not supported");
@@ -105,6 +121,7 @@ public class SolrProducer extends DefaultProducer {
if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class))) {
String mimeType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler());
+ updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword());
updateRequest.addFile((File) body, mimeType);
for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
@@ -121,6 +138,7 @@ public class SolrProducer extends DefaultProducer {
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
String mimeType = mimeTypesMap.getContentType((File) body);
ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler());
+ updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword());
updateRequest.addFile((File) body, mimeType);
for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
@@ -134,7 +152,7 @@ public class SolrProducer extends DefaultProducer {
} else if (body instanceof SolrInputDocument) {
- UpdateRequest updateRequest = new UpdateRequest(getRequestHandler());
+ UpdateRequest updateRequest = createUpdateRequest();
updateRequest.add((SolrInputDocument) body);
for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
@@ -150,7 +168,7 @@ public class SolrProducer extends DefaultProducer {
List<?> list = (List<?>) body;
if (list.size() > 0 && list.get(0) instanceof SolrInputDocument) {
- UpdateRequest updateRequest = new UpdateRequest(getRequestHandler());
+ UpdateRequest updateRequest = createUpdateRequest();
updateRequest.add((List<SolrInputDocument>) list);
for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
@@ -177,7 +195,7 @@ public class SolrProducer extends DefaultProducer {
if (hasSolrHeaders) {
- UpdateRequest updateRequest = new UpdateRequest(getRequestHandler());
+ UpdateRequest updateRequest = createUpdateRequest();
SolrInputDocument doc = new SolrInputDocument();
for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
@@ -198,6 +216,7 @@ public class SolrProducer extends DefaultProducer {
}
DirectXmlRequest xmlRequest = new DirectXmlRequest(getRequestHandler(), bodyAsString);
+ xmlRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword());
solrServer.request(xmlRequest);
} else {
@@ -217,6 +236,12 @@ public class SolrProducer extends DefaultProducer {
return (requestHandler == null) ? "/update" : requestHandler;
}
+ private UpdateRequest createUpdateRequest() {
+ UpdateRequest updateRequest = new UpdateRequest(getRequestHandler());
+ updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword());
+ return updateRequest;
+ }
+
@Override
public SolrEndpoint getEndpoint() {
return (SolrEndpoint) super.getEndpoint();
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
index b00de3c..28aa221 100644
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
@@ -49,6 +49,7 @@ public class InitSolrEndpointTest extends SolrTestSupport {
+ "&maxRetries=1&soTimeout=100&connectionTimeout=100"
+ "&defaultMaxConnectionsPerHost=100&maxTotalConnections=100"
+ "&followRedirects=false&allowCompression=true"
- + "&requestHandler=/update";
+ + "&requestHandler=/update"
+ + "&username=solr&password=SolrRocks";
}
}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java
index ece404e..fe3658e 100644
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java
@@ -26,6 +26,7 @@ import org.apache.camel.builder.RouteBuilder;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.junit.AfterClass;
import org.junit.Before;
@@ -71,8 +72,10 @@ public abstract class SolrComponentTestSupport extends SolrTestSupport {
protected QueryResponse executeSolrQuery(String query) throws SolrServerException, IOException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(query);
+ QueryRequest queryRequest = new QueryRequest(solrQuery);
+ queryRequest.setBasicAuthCredentials("solr", "SolrRocks");
SolrClient solrServer = solrFixtures.getServer();
- return solrServer.query("collection1", solrQuery);
+ return queryRequest.process(solrServer, "collection1");
}
@BeforeClass
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java
index b9cdcf9..2de4b66 100644
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java
@@ -23,8 +23,9 @@ import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
-
-
+import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
+import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
+import org.apache.solr.client.solrj.request.UpdateRequest;
public class SolrFixtures {
static Logger log = Logger.getLogger(SolrFixtures.class);
@@ -50,13 +51,15 @@ public class SolrFixtures {
String solrRouteUri() {
if (serverType == TestServerType.USE_HTTPS) {
- return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1";
+ return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1"
+ + "?username=solr&password=SolrRocks";
} else if (serverType == TestServerType.USE_CLOUD) {
String zkAddrStr = cloudFixture.miniCluster.getZkServer().getZkAddress();
return "solrCloud://localhost:" + httpsPort + "/solr?zkHost=" + zkAddrStr
- + "&collection=collection1";
+ + "&collection=collection1&username=solr&password=SolrRocks";
} else {
- return "solr://localhost:" + port + "/solr/collection1";
+ return "solr://localhost:" + port + "/solr/collection1"
+ + "?username=solr&password=SolrRocks";
}
}
@@ -99,18 +102,19 @@ public class SolrFixtures {
}
public static void clearIndex() throws SolrServerException, IOException {
+ UpdateRequest updateRequest = new UpdateRequest();
+ updateRequest.setBasicAuthCredentials("solr", "SolrRocks");
+ updateRequest.deleteByQuery("*:*");
+ updateRequest.setAction(ACTION.COMMIT, true, true);
if (solrServer != null) {
// Clear the Solr index.
- solrServer.deleteByQuery("collection1", "*:*");
- solrServer.commit("collection1");
+ updateRequest.process(solrServer, "collection1");
}
if (solrHttpsServer != null) {
- solrHttpsServer.deleteByQuery("collection1", "*:*");
- solrHttpsServer.commit("collection1");
+ updateRequest.process(solrHttpsServer, "collection1");
}
if (cloudFixture != null) {
- cloudFixture.solrClient.deleteByQuery("*:*");
- cloudFixture.solrClient.commit();
+ updateRequest.process(cloudFixture.solrClient);
}
}
}
diff --git a/components/camel-solr/src/test/resources/solr/security.json b/components/camel-solr/src/test/resources/solr/security.json
new file mode 100644
index 0000000..bfaa8e1
--- /dev/null
+++ b/components/camel-solr/src/test/resources/solr/security.json
@@ -0,0 +1,13 @@
+{
+ "authentication":{
+ "blockUnknown": false,
+ "class":"solr.BasicAuthPlugin",
+ "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="},
+ "realm":"My Solr users"
+ },
+ "authorization":{
+ "class":"solr.RuleBasedAuthorizationPlugin",
+ "permissions":[{"name":"security-edit",
+ "role":"admin"}],
+ "user-role":{"solr":"admin"}
+ }}
\ No newline at end of file