jamesfredley commented on code in PR #1205:
URL:
https://github.com/apache/grails-spring-security/pull/1205#discussion_r2829738414
##########
plugin-core/plugin/src/main/groovy/grails/plugin/springsecurity/SecurityAutoConfigurationExcluder.groovy:
##########
@@ -46,7 +58,16 @@ import
org.springframework.boot.autoconfigure.AutoConfigurationMetadata
* @see AutoConfigurationImportFilter
*/
@CompileStatic
-class SecurityAutoConfigurationExcluder implements
AutoConfigurationImportFilter {
+class SecurityAutoConfigurationExcluder implements
AutoConfigurationImportFilter, EnvironmentAware {
+
+ static final String ENABLED_PROPERTY =
'grails.plugin.springsecurity.excludeSpringSecurityAutoConfiguration'
+
+ private boolean enabled = true
+
+ @Override
+ void setEnvironment(Environment environment) {
+ this.enabled = environment.getProperty(ENABLED_PROPERTY, Boolean, true)
Review Comment:
This does work. Spring Boot's `AutoConfigurationImportSelector` explicitly
calls `invokeAwareMethods(filter)` on every `AutoConfigurationImportFilter`
**before** `match()` is ever called. The `invokeAwareMethods()` method
explicitly handles `EnvironmentAware`:
```java
// AutoConfigurationImportSelector.java (Spring Boot 3.5.x)
private ConfigurationClassFilter getConfigurationClassFilter() {
List<AutoConfigurationImportFilter> filters =
getAutoConfigurationImportFilters();
for (AutoConfigurationImportFilter filter : filters) {
invokeAwareMethods(filter); // <-- setEnvironment() called here
}
configurationClassFilter = new
ConfigurationClassFilter(this.beanClassLoader, filters);
// match() is only called later, inside ConfigurationClassFilter.filter()
}
private void invokeAwareMethods(Object instance) {
if (instance instanceof EnvironmentAware environmentAwareInstance) {
environmentAwareInstance.setEnvironment(this.environment);
}
// Also handles BeanClassLoaderAware, BeanFactoryAware,
ResourceLoaderAware
}
```
[Source
permalink](https://github.com/spring-projects/spring-boot/blob/8bcab02efd20d38f1a0a7b2f8e886268f0d69873/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java#L277-L287)
This is also an established pattern used in production by multiple libraries
(RocketMQ, Kafka, Redis starters) that implement `AutoConfigurationImportFilter
+ EnvironmentAware` to read YAML properties in `match()`.
I verified this with a real integration test in a sample Grails 7.0.7 app
using the locally-built plugin from this PR branch:
- **Default behavior** (property absent): `SecurityAutoConfiguration` bean
is NOT registered (6 passing assertions)
- **Opt-out** (`excludeSpringSecurityAutoConfiguration: false`):
`SecurityAutoConfiguration` bean IS registered
Test app:
https://github.com/jamesfredley/grails-spring-security-autoconfig-exclusion
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]