This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-mcp.git
The following commit(s) were added to refs/heads/main by this push:
new 705bc5f feat(security): add configurable security bypass for HTTP
mode (#40)
705bc5f is described below
commit 705bc5f74ca73f1592a19062fb310e81d6942601
Author: Aditya Parikh <[email protected]>
AuthorDate: Tue Feb 3 17:03:03 2026 -0500
feat(security): add configurable security bypass for HTTP mode (#40)
Add ability to disable OAuth2 security in HTTP mode for local development
and testing scenarios. Security can be toggled via spring.security.enabled
property:
- spring.security.enabled=true (default): Full OAuth2 authentication
- spring.security.enabled=false: All requests permitted, @PreAuthorize
bypassed
Changes:
- Add @ConditionalOnProperty to SecurityFilterChain beans
- Extract @EnableMethodSecurity to separate MethodSecurityConfiguration
- Add unsecured() filter chain for when security is disabled
- Default to security disabled in application-http.properties
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <[email protected]>
---
.../mcp/server/config/McpServerConfiguration.java | 15 +++++++--
.../server/config/MethodSecurityConfiguration.java | 37 ++++++++++++++++++++++
.../mcp/server/metadata/CollectionService.java | 19 ++++++-----
.../solr/mcp/server/metadata/SchemaService.java | 4 +--
src/main/resources/application-http.properties | 4 ++-
5 files changed, 63 insertions(+), 16 deletions(-)
diff --git
a/src/main/java/org/apache/solr/mcp/server/config/McpServerConfiguration.java
b/src/main/java/org/apache/solr/mcp/server/config/McpServerConfiguration.java
index 5a4b0ab..17b4070 100644
---
a/src/main/java/org/apache/solr/mcp/server/config/McpServerConfiguration.java
+++
b/src/main/java/org/apache/solr/mcp/server/config/McpServerConfiguration.java
@@ -19,10 +19,10 @@ package org.apache.solr.mcp.server.config;
import java.util.List;
import
org.springaicommunity.mcp.security.server.config.McpServerOAuth2Configurer;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
-import
org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import
org.springframework.security.config.annotation.web.builders.HttpSecurity;
import
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import
org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
@@ -34,13 +34,13 @@ import
org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Profile("http")
@Configuration
@EnableWebSecurity
-@EnableMethodSecurity // ⬅️ enable annotation-driven security
class McpServerConfiguration {
- @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
+ @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri:}")
private String issuerUrl;
@Bean
+ @ConditionalOnProperty(name = "spring.security.enabled", havingValue =
"true", matchIfMissing = true)
SecurityFilterChain securityFilterChain(HttpSecurity http) throws
Exception {
return http
// ⬇️ Open every request on the server
@@ -60,6 +60,15 @@ class McpServerConfiguration {
.build();
}
+ @Bean
+ @ConditionalOnProperty(name = "spring.security.enabled", havingValue =
"false")
+ SecurityFilterChain unsecured(HttpSecurity http) throws Exception {
+ return http.authorizeHttpRequests(auth ->
auth.anyRequest().permitAll())
+ // MCP inspector
+ .cors(cors ->
cors.configurationSource(corsConfigurationSource())).csrf(CsrfConfigurer::disable)
+ .build();
+ }
+
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOriginPatterns(List.of("*"));
diff --git
a/src/main/java/org/apache/solr/mcp/server/config/MethodSecurityConfiguration.java
b/src/main/java/org/apache/solr/mcp/server/config/MethodSecurityConfiguration.java
new file mode 100644
index 0000000..7345a57
--- /dev/null
+++
b/src/main/java/org/apache/solr/mcp/server/config/MethodSecurityConfiguration.java
@@ -0,0 +1,37 @@
+/*
+ * 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.solr.mcp.server.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import
org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+
+/**
+ * Configuration class that enables method-level security only when
+ * spring.security.enabled=true (or not set).
+ *
+ * <p>
+ * This allows the application to run without authentication when
+ * spring.security.enabled=false, bypassing @PreAuthorize annotations.
+ */
+@Profile("http")
+@Configuration
+@ConditionalOnProperty(name = "spring.security.enabled", havingValue = "true",
matchIfMissing = true)
+@EnableMethodSecurity
+class MethodSecurityConfiguration {
+}
diff --git
a/src/main/java/org/apache/solr/mcp/server/metadata/CollectionService.java
b/src/main/java/org/apache/solr/mcp/server/metadata/CollectionService.java
index 28370cf..eb2c606 100644
--- a/src/main/java/org/apache/solr/mcp/server/metadata/CollectionService.java
+++ b/src/main/java/org/apache/solr/mcp/server/metadata/CollectionService.java
@@ -16,7 +16,16 @@
*/
package org.apache.solr.mcp.server.metadata;
+import static org.apache.solr.mcp.server.metadata.CollectionUtils.getFloat;
+import static org.apache.solr.mcp.server.metadata.CollectionUtils.getInteger;
+import static org.apache.solr.mcp.server.metadata.CollectionUtils.getLong;
+import static org.apache.solr.mcp.server.util.JsonUtils.toJson;
+
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
@@ -41,16 +50,6 @@ import org.springaicommunity.mcp.annotation.McpTool;
import org.springaicommunity.mcp.annotation.McpToolParam;
import org.springframework.stereotype.Service;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import static org.apache.solr.mcp.server.metadata.CollectionUtils.getFloat;
-import static org.apache.solr.mcp.server.metadata.CollectionUtils.getInteger;
-import static org.apache.solr.mcp.server.metadata.CollectionUtils.getLong;
-import static org.apache.solr.mcp.server.util.JsonUtils.toJson;
-
/**
* Spring Service providing comprehensive Solr collection management and
* monitoring capabilities for Model Context Protocol (MCP) clients.
diff --git
a/src/main/java/org/apache/solr/mcp/server/metadata/SchemaService.java
b/src/main/java/org/apache/solr/mcp/server/metadata/SchemaService.java
index a3b8f05..31f62f1 100644
--- a/src/main/java/org/apache/solr/mcp/server/metadata/SchemaService.java
+++ b/src/main/java/org/apache/solr/mcp/server/metadata/SchemaService.java
@@ -16,6 +16,8 @@
*/
package org.apache.solr.mcp.server.metadata;
+import static org.apache.solr.mcp.server.util.JsonUtils.toJson;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.request.schema.SchemaRequest;
@@ -24,8 +26,6 @@ import org.springaicommunity.mcp.annotation.McpResource;
import org.springaicommunity.mcp.annotation.McpTool;
import org.springframework.stereotype.Service;
-import static org.apache.solr.mcp.server.util.JsonUtils.toJson;
-
/**
* Spring Service providing schema introspection and management capabilities
for
* Apache Solr collections.
diff --git a/src/main/resources/application-http.properties
b/src/main/resources/application-http.properties
index 60c5daa..1f96a7b 100644
--- a/src/main/resources/application-http.properties
+++ b/src/main/resources/application-http.properties
@@ -7,4 +7,6 @@ spring.ai.mcp.server.stdio=false
# For Auth0: https://<your-auth0-domain>/.well-known/openid-configuration
# For Keycloak: https://<keycloak-host>/realms/<realm-name>
# For Okta:
https://<your-okta-domain>/oauth2/default/.well-known/openid-configuration
-spring.security.oauth2.resourceserver.jwt.issuer-uri=${OAUTH2_ISSUER_URI:https://your-auth0-domain.auth0.com/}
\ No newline at end of file
+spring.security.oauth2.resourceserver.jwt.issuer-uri=${OAUTH2_ISSUER_URI:https://your-auth0-domain.auth0.com/}
+# Security toggle - set to true to enable OAuth2 authentication, false to
bypass
+spring.security.enabled=${SECURITY_ENABLED:false}
\ No newline at end of file