Auto-exclude conflicting Spring Boot security auto-configurations#1205
Auto-exclude conflicting Spring Boot security auto-configurations#1205jamesfredley wants to merge 5 commits intoapache:7.0.xfrom
Conversation
There was a problem hiding this comment.
Pull request overview
Adds an AutoConfigurationImportFilter to the plugin so Spring Boot security auto-configurations that conflict with the Grails Spring Security plugin are automatically excluded, removing the need for users to manually maintain spring.autoconfigure.exclude entries.
Changes:
- Introduces
SecurityAutoConfigurationExcluderimplementingAutoConfigurationImportFilterto filter 7 known conflicting Spring Boot auto-configurations. - Registers the filter via
META-INF/spring.factories. - Adds Spock coverage for exclusion behavior and filter registration; adds
spring-boot-autoconfigureascompileOnlyfor the SPI type.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
plugin-core/plugin/src/main/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluder.groovy |
New import filter that excludes conflicting Spring Boot security auto-configurations. |
plugin-core/plugin/src/main/resources/META-INF/spring.factories |
SPI registration for the new auto-config import filter. |
plugin-core/plugin/build.gradle |
Adds spring-boot-autoconfigure as compileOnly to compile against the SPI. |
plugin-core/plugin/src/test/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluderSpec.groovy |
New Spock spec validating filtering behavior and SPI registration. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
...in/src/test/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluderSpec.groovy
Outdated
Show resolved
Hide resolved
...plugin/src/main/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluder.groovy
Show resolved
Hide resolved
Add SecurityAutoConfigurationExcluder implementing AutoConfigurationImportFilter to automatically exclude 7 Spring Boot security auto-configuration classes that conflict with the Grails Spring Security plugin. Previously, every Grails 7 user had to manually add spring.autoconfigure.exclude entries to application.yml (documented in README). This filter eliminates that requirement by filtering them out during Spring Boot's auto-configuration discovery phase, before bytecode is loaded. Excluded auto-configurations: - SecurityAutoConfiguration - SecurityFilterAutoConfiguration - UserDetailsServiceAutoConfiguration - OAuth2ClientAutoConfiguration (2 packages) - OAuth2ResourceServerAutoConfiguration - ManagementWebSecurityAutoConfiguration Implementation: - SecurityAutoConfigurationExcluder.groovy — the filter - META-INF/spring.factories — SPI registration - build.gradle — compileOnly spring-boot-autoconfigure - SecurityAutoConfigurationExcluderSpec — 18 Spock tests
5dc44fb to
a783a42
Compare
|
related to apache/grails-core#15405, which needs exclusions also |
jdaugherty
left a comment
There was a problem hiding this comment.
How do you opt out of this? What if you want to override it?
Users can now disable the automatic exclusion of Spring Boot security auto-configurations by setting: grails.plugin.springsecurity.excludeSpringSecurityAutoConfiguration: false in application.yml. The filter implements EnvironmentAware so it reads the property during the auto-configuration discovery phase. Defaults to true (exclusions active) for backward compatibility. Assisted-by: Claude Code <Claude@Claude.ai>
Assisted-by: Claude Code <Claude@Claude.ai>
|
Addressed - the filter now implements grails:
plugin:
springsecurity:
excludeSpringSecurityAutoConfiguration: falseDefaults to Also updated the README to document both the automatic behavior and the opt-out. |
Assisted-by: Claude Code <Claude@Claude.ai>
34b806b to
6588157
Compare
...plugin/src/main/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluder.groovy
Show resolved
Hide resolved
...plugin/src/main/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluder.groovy
Show resolved
Hide resolved
| thrown(UnsupportedOperationException) | ||
| } | ||
|
|
||
| def "match allows all auto-configurations when disabled via environment property"() { |
There was a problem hiding this comment.
I think you should an actual functional test for this. I'm pretty sure this coudl be broken, but it may only be in edge cases with plugin's having configuration instead of the end app.
There was a problem hiding this comment.
Added in 9656c948:
-
Integration test in the plugin repo (
SecurityAutoConfigurationExcluderIntegrationSpec) - runs in thecore-examples-integration-test-appwith the full Grails context. Verifies the excluder is on the classpath,SecurityAutoConfigurationandSecurityFilterAutoConfigurationbeans are NOT registered, no duplicateSecurityFilterChainbeans, and only the plugin'sUserDetailsServiceis active. All 5 assertions pass. -
External sample app with two integration test specs:
SecurityAutoConfigExclusionSpec(6 tests) - proves auto-configs are excluded by defaultSecurityAutoConfigOptOutDisabledSpec(1 test) - proves settingexcludeSpringSecurityAutoConfiguration: falseletsSecurityAutoConfigurationthrough (confirming theEnvironmentAwareopt-out works)
App: https://github.com/jamesfredley/grails-spring-security-autoconfig-exclusion (uses locally-built
7.0.2-SNAPSHOTfrom this PR branch viamavenLocal())
There was a problem hiding this comment.
we have example apps in the srpign security repo, why not import it here?
…iguration property Add SecurityAutoConfigurationExcluderIntegrationSpec to verify the auto-configuration exclusion filter works in a full Grails context. Add the excludeSpringSecurityAutoConfiguration property to the miscProperties reference table. Assisted-by: Claude Code <Claude@Claude.ai>
jdaugherty
left a comment
There was a problem hiding this comment.
I'm glad to see it working, wecan merge this. I'd prefer we just import a functional test app here though.
Summary
Adds
SecurityAutoConfigurationExcluderimplementingAutoConfigurationImportFilterto automatically exclude 7 Spring Boot security auto-configuration classes that conflict with the Grails Spring Security plugin. This eliminates the manualspring.autoconfigure.excludeentries that every Grails 7 user currently must add toapplication.yml.Feature Description
The plugin README documents that Grails 7 requires 7 manual
spring.autoconfigure.excludeentries:These exclusions are always required — not conditional or environment-specific. This boilerplate is easy to miss, hard to debug when forgotten, and should be handled automatically by the plugin.
Implementation
Approach:
AutoConfigurationImportFilterSPI (stable since Spring Boot 1.5.0, used in 3.x)Why
AutoConfigurationImportFilterover alternativesEnvironmentPostProcessorspring.autoconfigure.excludeis aList— property sources cannot merge lists reliably (Spring Boot #41669). User's own exclusions would be overwritten.@EnableAutoConfiguration(exclude=...)on plugin class@Grailsannotation, can't also use@EnableAutoConfigurationAutoConfigurationImportFilter✓ Opt-out via
excludeSpringSecurityAutoConfiguration: false✓ No property merging issues
✓ Used by established libraries (Redis OM Spring, TCC Transaction)
Files Changed
SecurityAutoConfigurationExcluder.groovyAutoConfigurationImportFilterimplementation that returnsfalsefor the 7 conflicting auto-configurationsMETA-INF/spring.factoriesspring.factoriesin Spring Boot 3.x, not.imports)build.gradlecompileOnly 'org.springframework.boot:spring-boot-autoconfigure'— always available at runtime in any Grails appSecurityAutoConfigurationExcluderSpec.groovyspring.factoriesregistrationTest Coverage (18 tests, all pass)
spring.factoriesregistration is correctBackward Compatibility
application.ymlare unaffected — the filter and manual exclusions are independent mechanismsspring-boot-autoconfigureis added ascompileOnlyonly — no new runtime dependency (it's always already present via Spring Boot starter)Example Application
https://github.com/jamesfredley/grails-spring-security-autoconfig-exclusion
A minimal Grails 7.0.7 app with spring-security configured (User/Role/UserRole domains, annotation-based security) that intentionally does NOT include the manual exclusions. The
/bugDemo/indexendpoint shows which auto-configuration classes are on the classpath and which beans are registered.Environment Information
Version
7.0.x
Opt-Out
Users can disable the automatic exclusion by setting the following property in
application.yml:This allows Spring Boot's security auto-configurations to run normally, for users who want to override or use Spring Boot's security setup directly. The filter implements
EnvironmentAwareto read this property during the auto-configuration discovery phase.