Spring配置多个authentication providers时登录页加载失败报错问题排查
配置问题排查与修复方案
核心问题原因
Spring Security 多<http>配置遵循前缀匹配、按顺序生效的规则,只有请求路径匹配<http>的pattern属性时,才会走对应的安全过滤链,你当前的配置存在多个路径无法匹配到对应过滤链的问题,具体如下:
问题1:登录/登出处理路径未匹配到对应安全链
Spring Security form-login默认的登录提交路径是/j_spring_security_check,logout默认的登出路径是/j_spring_security_logout,这两个路径都不属于你配置的/portal/**、/siviri/**前缀范围,没有对应过滤链处理,直接触发错误。
修复方法:
给每个模块的登录、登出配置指定对应前缀下的处理路径:
<!-- portal 模块http块修改 --> <form-login login-page='/portal/portal_login.jsp' login-processing-url="/portal/j_spring_security_check" authentication-failure-url="/portal/portal_login.jsp?error=true" authentication-failure-handler-ref="customAuthenticationFailureHandlerPortal" authentication-success-handler-ref="customAuthenticationSuccessPortal"/> <logout logout-success-url="/portal/portal_login.jsp" invalidate-session="false" logout-url="/portal/j_spring_security_logout" /> <!-- siviri 模块http块修改 --> <form-login login-page="/siviri/crm_login.jsp" login-processing-url="/siviri/j_spring_security_check" authentication-failure-url="/siviri/crm_login.jsp?error=true" authentication-failure-handler-ref="customAuthenticationFailureHandler" authentication-success-handler-ref="customAuthenticationSuccess"/> <logout logout-success-url="/siviri/crm_login.jsp" invalidate-session="false" logout-url="/siviri/j_spring_security_logout" />
同时修改对应登录页的表单提交地址、登出按钮的请求地址,和上面配置的路径保持一致。
问题2:缺少默认安全过滤链
你当前仅配置了两个匹配指定前缀的<http>规则,所有不在/portal/**、/siviri/**下的请求都没有对应安全链处理,会直接抛出异常。
修复方法:
在所有<http>配置的最后添加默认兜底的安全链:
<http use-expressions="true" pattern="/**"> <intercept-url pattern="/**" access="permitAll" /> <csrf disabled="true"/> </http>
问题3:认证成功跳转路径配置错误
你两个成功处理器的redirectPage都配置的是根路径下的/crm.jsp,和你多模块的路径规则不匹配,登录成功后会出现404。
修复方法:
修改对应bean的redirectPage属性为正确的模块内路径:
<!-- siviri模块成功处理器 --> <b:bean id="customAuthenticationSuccess" class="authentication.providers.NA_AuthenticationSuccess"> <b:property name="redirectPage" value="/siviri/crm.jsp"></b:property> </b:bean> <!-- portal模块成功处理器 --> <b:bean id="customAuthenticationSuccessPortal" class="authentication.providers.NA_AuthenticationSuccessPortal"> <b:property name="redirectPage" value="/portal/portal.jsp"></b:property> </b:bean>
问题4:CSRF配置不一致
你siviri模块的http块禁用了CSRF,portal模块没有禁用,如果你的登录表单没有携带CSRF token,提交登录时会返回403错误,和你单http配置的行为不一致。
修复方法:
在portal模块的http块也添加CSRF禁用配置:
<http use-expressions="true" pattern="/portal/**" authentication-manager-ref = "authenticationManagerPortal"> <!-- 原有其他配置 --> <csrf disabled="true" /> </http>
内容的提问来源于stack exchange,提问作者Andreas10425
相关产品推荐
相关产品推荐

