2525import org .springaicommunity .mcp .security .server .oauth2 .metadata .OAuth2ProtectedResourceMetadataEndpointFilter ;
2626import org .springaicommunity .mcp .security .server .oauth2 .metadata .ResourceIdentifier ;
2727
28+ import org .springframework .security .config .Customizer ;
2829import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
2930import org .springframework .security .config .annotation .web .configurers .AbstractHttpConfigurer ;
31+ import org .springframework .security .config .annotation .web .configurers .oauth2 .server .resource .OAuth2ResourceServerConfigurer ;
3032import org .springframework .security .oauth2 .core .OAuth2TokenValidator ;
3133import org .springframework .security .oauth2 .jwt .Jwt ;
3234import org .springframework .security .oauth2 .jwt .JwtDecoder ;
@@ -54,6 +56,9 @@ public class McpServerOAuth2Configurer extends AbstractHttpConfigurer<McpServerO
5456
5557 private boolean validateAudienceClaim = false ;
5658
59+ private Customizer <OAuth2ResourceServerConfigurer <HttpSecurity >> oauth2ResourceServerCustomizer = Customizer
60+ .withDefaults ();
61+
5762 public McpServerOAuth2Configurer authorizationServer (String issuerUri ) {
5863 this .issuerUri = issuerUri ;
5964 return this ;
@@ -90,6 +95,20 @@ public McpServerOAuth2Configurer validateAudienceClaim(boolean validateAudienceC
9095 return this ;
9196 }
9297
98+ /**
99+ * Customize the underlying Spring Security OAuth2 Resource Server configuration,
100+ * through a {@link OAuth2ResourceServerConfigurer}.
101+ * @param oauth2ResourceServerCustomizer a customizer of OAuth2 Resource Server.
102+ * Defaults to a no-op {@link Customizer#withDefaults()}.
103+ * @return The {@link McpServerOAuth2Configurer} for further configuration.
104+ */
105+ private McpServerOAuth2Configurer oauth2ResourceServer (
106+ Customizer <OAuth2ResourceServerConfigurer <HttpSecurity >> oauth2ResourceServerCustomizer ) {
107+ Assert .notNull (oauth2ResourceServerCustomizer , "oauth2ResourceServerCustomizer cannot be null" );
108+ this .oauth2ResourceServerCustomizer = oauth2ResourceServerCustomizer ;
109+ return this ;
110+ }
111+
93112 @ Override
94113 public void init (HttpSecurity http ) throws Exception {
95114 Assert .notNull (this .issuerUri , "authorizationServer cannot be null" );
@@ -107,6 +126,7 @@ public void init(HttpSecurity http) throws Exception {
107126 .oauth2ResourceServer (resourceServer -> {
108127 resourceServer .jwt (jwt -> jwt .decoder (getJwtDecoder (http )));
109128 resourceServer .authenticationEntryPoint (entryPoint );
129+ this .oauth2ResourceServerCustomizer .customize (resourceServer );
110130 })
111131 .addFilterBefore (protectedResourceMetadataEndpointFilter , AbstractPreAuthenticatedProcessingFilter .class );
112132 //@formatter:on
0 commit comments