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]

Reply via email to