我正在尝试自定义 Spring Security 的 session 管理过滤器,但我收到错误消息,说我的过滤器和默认过滤器具有相同的“顺序”值(尽管我的 <session-managent>
配置中没有任何 <http>
并且我有autoconfig=false,正如 Spring Security 在其文档中所说)。
这是我对 Spring Security 的配置:
<http auto-config="false" use-expressions="true">
<custom-filter position="SESSION_MANAGEMENT_FILTER" ref="filtroGestionSesion" />
<intercept-url pattern="/resources/**" filters="none"/>
<intercept-url pattern="/faces/javax.faces.resource/**" filters="none"/>
<intercept-url pattern="/faces/inicio.xhtml" access="permitAll"/>
<intercept-url pattern="/faces/paginas/autenticacion/login.xhtml*" access="permitAll"/>
<intercept-url pattern="/faces/paginas/administracion/**" access="isAuthenticated()"/>
<intercept-url pattern="/faces/paginas/barco/**" access="isAuthenticated()"/>
<intercept-url pattern="/faces/paginas/catalogo/**" access="permitAll"/>
<intercept-url pattern="/faces/paginas/error/**" access="permitAll"/>
<intercept-url pattern="/faces/paginas/plantillas/**" access="permitAll"/>
<intercept-url pattern="/**" access="denyAll" />
<form-login login-processing-url="/j_spring_security_check"
login-page="/faces/paginas/autenticacion/login.xhtml"
default-target-url="/faces/paginas/administracion/inicioAdmon.xhtml"
always-use-default-target="true"
authentication-failure-url="/faces/paginas/autenticacion/login.xhtml?error=authentication" />
<logout logout-url="/j_spring_security_logout"
logout-success-url="/faces/inicio.xhtml"
invalidate-session="true" />
</http>
<global-method-security pre-post-annotations="enabled" />
<authentication-manager>
<authentication-provider>
<user-service>
<user name="myuser" password="myuser" authorities="" />
</user-service>
</authentication-provider>
</authentication-manager>
<beans:bean id="filtroGestionSesion" class="springSecurity.FiltroGestionSesion">
<beans:constructor-arg ref="securityContextRepository" />
<beans:property name="invalidSessionUrl" value="/faces/paginas/autenticacion/login.xhtml?error=timeout" />
</beans:bean>
<beans:bean id="securityContextRepository" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository" />
带有我的自定义过滤器 (springSecurity.FiltroGestionSesion) 的类是从 Spring Security (org.springframework.security.web.session.SessionManagementFilter) 复制粘贴的,但更改了包名、类名和我添加的一些自定义代码到 doFilter 方法。
为什么它不起作用并抛出错误说两个过滤器具有相同的顺序?
我已经通过从
<session-mangement>
中删除相应的子元素 <http>
来禁用默认过滤器,这样我的过滤器的位置就不会与默认过滤器冲突。我是否必须删除任何其他元素或自定义其他任何内容?
任何人都知道如何在 SESSION_MANAGEMENT_FILTER 禁用默认过滤器的位置进行自定义过滤器工作?
先感谢您。
最佳答案
我终于找到了解决方案。如果有人感兴趣,我会把它放在这里。
禁用默认 session 管理过滤器的方法不是从 <session-mangement>
中删除 <http>
元素,而是在没有 session 固定保护的情况下添加它:
<session-management session-fixation-protection="none" />
这样,默认 session 管理过滤器不会触发,您可以在该位置添加自定义过滤器,而不会在过滤器链中发生冲突。
我已经检查了它,查看了我的 webapp 中 spring security 的调试日志。
希望它可以帮助某人。
关于security - spring security 自定义 sessionmanagementfilter 相同顺序值错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9118793/