This is an automated email from the ASF dual-hosted git repository.

lprimak pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/shiro.git

commit ae7437f5cf0215524941ddb5ec760f2c61de40ea
Author: lprimak <[email protected]>
AuthorDate: Mon Feb 2 16:53:10 2026 -0600

    extracted filterMap() method to avoid circular dependency
---
 .../AbstractShiroWebFilterConfiguration.java       | 28 +++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git 
a/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebFilterConfiguration.java
 
b/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebFilterConfiguration.java
index 8104e63ec..c525ac61d 100644
--- 
a/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebFilterConfiguration.java
+++ 
b/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebFilterConfiguration.java
@@ -22,11 +22,14 @@ import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 import org.apache.shiro.web.config.ShiroFilterConfiguration;
 import org.apache.shiro.web.filter.mgt.DefaultFilter;
+import org.apache.shiro.web.servlet.AbstractShiroFilter;
+import org.springframework.beans.factory.ListableBeanFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 
 import jakarta.servlet.Filter;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -44,8 +47,8 @@ public class AbstractShiroWebFilterConfiguration {
     @Autowired(required = false)
     protected ShiroFilterConfiguration shiroFilterConfiguration;
 
-    @Autowired(required = false)
-    protected Map<String, Filter> filterMap;
+    @Autowired
+    protected ListableBeanFactory beanFactory;
 
     @Value("#{ @environment['shiro.loginUrl'] ?: '/login.jsp' }")
     protected String loginUrl;
@@ -69,6 +72,24 @@ public class AbstractShiroWebFilterConfiguration {
                 : new ShiroFilterConfiguration();
     }
 
+    /**
+     * Collects Filter beans from the application context, excluding any 
AbstractShiroFilter
+     * instances to avoid circular dependency with ShiroFilterFactoryBean.
+     *
+     * @return a map of filter names to Filter instances
+     */
+    protected Map<String, Filter> filterMap() {
+        Map<String, Filter> filterMap = new LinkedHashMap<>();
+        Map<String, Filter> allFilters = 
beanFactory.getBeansOfType(Filter.class);
+        for (Map.Entry<String, Filter> entry : allFilters.entrySet()) {
+            // Exclude AbstractShiroFilter instances to avoid circular 
dependency
+            if (!(entry.getValue() instanceof AbstractShiroFilter)) {
+                filterMap.put(entry.getKey(), entry.getValue());
+            }
+        }
+        return filterMap;
+    }
+
     protected ShiroFilterFactoryBean shiroFilterFactoryBean() {
         ShiroFilterFactoryBean filterFactoryBean = new 
ShiroFilterFactoryBean();
 
@@ -82,7 +103,8 @@ public class AbstractShiroWebFilterConfiguration {
         filterFactoryBean.setGlobalFilters(globalFilters());
         
filterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap());
 
-        if (filterMap != null) {
+        Map<String, Filter> filterMap = filterMap();
+        if (!filterMap.isEmpty()) {
             filterFactoryBean.setFilters(filterMap);
         }
 

Reply via email to