Login 在SpringSecurity中,成功登录后如何调用两个过滤器?

Login 在SpringSecurity中,成功登录后如何调用两个过滤器?,login,spring-security,filter,Login,Spring Security,Filter,我使用的是SpringSecurity3.1.4.RELEASE。我希望在成功验证后发生两件事。目前,我有这个 <beans:bean id="mycoUsernamePasswordUrlAuthenticationFilter" class="org.mainco.myco.core.security.mycoUsernamePasswordUrlAuthenticationFilter"> <beans:property name="filterProce

我使用的是SpringSecurity3.1.4.RELEASE。我希望在成功验证后发生两件事。目前,我有这个

<beans:bean id="mycoUsernamePasswordUrlAuthenticationFilter"
    class="org.mainco.myco.core.security.mycoUsernamePasswordUrlAuthenticationFilter">
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="authenticationFailureHandler">
        <beans:bean
            class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
            <beans:property name="defaultFailureUrl" value="/login/failure" />
            <beans:property name="exceptionMappings" ref="exceptionMappings" />
        </beans:bean>
    </beans:property>
    <beans:property name="authenticationSuccessHandler">
        <beans:bean
            class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
            <beans:property name="defaultTargetUrl" value="/success" />
        </beans:bean>
    </beans:property>
</beans:bean> 
…
<beans:bean id="customAuthenticationSuccessHandler" class="org.mainco.subco.security.CustomAuthenticationSuccessHandler">
    <beans:property name="sessionService" ref="sessionService" />
</beans:bean>

<http name="defaultSecurity" security-context-repository-ref="mycoSecurityContextRepository"
    auto-config="false" use-expressions="true" authentication-manager-ref="authenticationManager"
    access-denied-page="/denied" entry-point-ref="loginUrlAuthenticationEntryPoint">
    <custom-filter position="FORM_LOGIN_FILTER"
        ref="mycoUsernamePasswordUrlAuthenticationFilter" />
    <intercept-url pattern="/lti/launch" access="permitAll" />
    …
    <form-login authentication-success-handler-ref="customAuthenticationSuccessHandler" />
    <logout invalidate-session="true" logout-success-url="/logout" logout-url="/j_spring_security_logout" />
</http>

…
…
然而,在部署我的应用程序时,我得到了这个异常

Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Filter beans '<springboardUsernamePasswordUrlAuthenticationFilter>' and '<org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0>' have the same 'order' value. When using custom filters, please make sure the positions do not conflict with default filters. Alternatively you can disable the default filters by removing the corresponding child elements from <http> and avoiding the use of <http auto-config='true'>.
Offending resource: class path resource [META-INF/spring/applicationContext-ebook-security.xml]
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72)
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.checkFilterChainOrder(HttpSecurityBeanDefinitionParser.java:272)
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.createFilterChain(HttpSecurityBeanDefinitionParser.java:153)
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.parse(HttpSecurityBeanDefinitionParser.java:99)
    at org.springframework.security.config.SecurityNamespaceHandler.parse(SecurityNamespaceHandler.java:90)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:195)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:250)
    ... 29 more
原因:org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:筛选器bean“”和“”具有相同的“顺序”值。使用自定义过滤器时,请确保位置与默认过滤器不冲突。或者,您可以通过从中删除相应的子元素并避免使用来禁用默认过滤器。
有问题的资源:类路径资源[META-INF/spring/applicationContext ebook security.xml]
位于org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
位于org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
位于org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72)
位于org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.checkfilterchainoder(HttpSecurityBeanDefinitionParser.java:272)
位于org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.createFilterChain(HttpSecurityBeanDefinitionParser.java:153)
位于org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.parse(HttpSecurityBeanDefinitionParser.java:99)
位于org.springframework.security.config.SecurityNamespaceHandler.parse(SecurityNamespaceHandler.java:90)
位于org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
位于org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:195)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:250)
... 还有29个
我在任何筛选器声明中都找不到“order”属性。什么是正确的方式来重新安排我的配置上面,或至少做两件事一次登录


谢谢,

实际上,在给定的代码中,我只能看到一个过滤器

尝试声明您的筛选器,如:

<bean id="successfulAuthenticationFilters" class="org.springframework.web.filter.CompositeFilter">
    <property name="filters">
        <list>
            <ref bean="filter1"/>
            <ref bean="filter2"/>
        </list>
    </property>
</bean>

不仅仅是使用:

<custom-filter position="FORM_LOGIN_FILTER"
        ref="successfulAuthenticationFilters" />


它将执行您的两个筛选器,而不是默认的表单登录筛选器。

我最后做的是创建自己的成功处理程序类,该类扩展了org.springframework.security.web.authentication.SimpleRulAuthenticationSuccessHandler,并进行声明

<beans:bean id="mycoUsernamePasswordUrlAuthenticationFilter"
    class="org.mainco.myco.core.security.mycoUsernamePasswordUrlAuthenticationFilter">
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="authenticationFailureHandler">
        <beans:bean
            class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
            <beans:property name="defaultFailureUrl" value="/login/failure" />
            <beans:property name="exceptionMappings" ref="exceptionMappings" />
        </beans:bean>
    </beans:property>
    <beans:property name="authenticationSuccessHandler">
        <beans:bean
            class=“org.mainco.subco.myproject.MyCustomAuthenticationSuccessHandler”>
            <beans:property name="defaultTargetUrl" value="/success" />
        </beans:bean>
    </beans:property>
</beans:bean>


因此,我可以做两件事。

第一个过滤器是id为“MyCustomerNamePasswordUrlAuthenticationFilter”的bean的“authenticationSuccessHandler”属性,第二个是“form login authentication SuccessHandler ref”声明。当我尝试您的建议时,我遇到了错误,“java.lang.IllegalStateException:无法将[org.mainco.subco.security.CustomAuthenticationSuccessHandler]类型的值转换为属性“filters[1]”所需的[javax.servlet.Filter]类型:找不到匹配的编辑器或转换策略”,因此您没有调用两个筛选器,但是有两个AuthenticationSuccessHandler—您不能这样做。如果我正确理解了您想要实现的目标,您可以使用authenticationSuccessHandler重定向到成功url。相反,删除它并将customAuthenticationSuccessHandler更改为重定向到“/success”,最终您可以将逻辑从customAuthenticationSuccessHandler移动到某个新的筛选器类(实现筛选器接口),并在表单登录筛选器后执行它: