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); }
