Ricardo Mendes created SHIRO-792:
------------------------------------
Summary: ShiroWebFilterConfiguration seems to conflict with other
FilterRegistrationBean
Key: SHIRO-792
URL: https://issues.apache.org/jira/browse/SHIRO-792
Project: Shiro
Issue Type: Bug
Components: Integration: Spring
Affects Versions: 1.6.0
Reporter: Ricardo Mendes
Assignee: Les Hazlewood
I'm using {{shiro-spring-boot-web-starter 1.6.0}} within a web application
developed with {{Spring Boot v2.3.2.RELEASE}}.
When I add one or more filters to the application using
{{@Bean}}/{{FilterRegistrationBean}} (example below), the Shiro filter is not
properly loaded anymore, and all requests start to fail.
{{@Bean}}
{{ public FilterRegistrationBean<LogoutFilter> logoutFilter() {}}
{{ final FilterRegistrationBean<LogoutFilter> registrationBean = new
FilterRegistrationBean<>();}}
{{ registrationBean.addUrlPatterns("/security/logout");}}
{{ registrationBean.setFilter(new LogoutFilter());}}
{{ registrationBean.setName("logoutFilter");}}
{{ return registrationBean;}}
{{ }}}
I ran some tests to figure out what's going on and it turns out the
{{@ConditionalOnMissingBean}} used to annotate
{{filterShiroFilterRegistrationBean()}}
[here|[https://github.com/apache/shiro/blob/shiro-root-1.6.0/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroWebFilterConfiguration.java#L48]]
seems to be the culprit.
When there are more {{FilterRegistrationBean}}'s annotated with
{{@ConditionalOnMissingBean}} in the application, the condition evaluates
false, and the Shiro filter is not loaded.
As a workaround, I've added the below configuration to the application and now
everything works fine:
{{@Configuration}}
{{public class ShiroWebFilterConfig extends AbstractShiroWebFilterConfiguration
{}}
{{@Bean}}
{{ protected FilterRegistrationBean<AbstractShiroFilter> shiroFilter() throws
Exception {}}
{{ final FilterRegistrationBean<AbstractShiroFilter> registrationBean = new
FilterRegistrationBean<>();}}
{{ registrationBean.setDispatcherTypes(DispatcherType.REQUEST,
DispatcherType.FORWARD, DispatcherType.INCLUDE,}}
{{ DispatcherType.ERROR);}}
{{ registrationBean.setFilter((AbstractShiroFilter)
shiroFilterFactoryBean().getObject());}}
{{ registrationBean.setName("shiroFilter");}}
{{ registrationBean.setOrder(1);}}
{{return registrationBean;}}
{{ }}}
{{}}}
Makes sense?
Kind regards, Ricardo.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)