Spring Security多<http>块重叠配置导致/api请求错误跳转登录页问题
问题根因
Spring Boot 2.5.4对应Spring Security 5.5.x版本,该版本调整了多安全过滤链(即XML中<http>块对应生成的实例)的优先级判定规则,旧版本默认按XML配置顺序从上到下匹配,新版本未显式指定优先级时,通配范围更大的/**过滤链可能优先匹配到/api/**的请求,导致API请求落入表单登录的鉴权逻辑,触发重定向循环。
解决方案
你需要通过以下两步配置保证/api/**的请求优先匹配专属的安全过滤链,不会触发通用规则:
1. 为两个<http>块显式指定优先级
Spring Security中order属性值越小,过滤链优先级越高,你需要给匹配路径更精准的/api/**块设置更高优先级:
<!-- 给API专属http块设置更高优先级,order值为1 --> <http pattern="/api/**" use-expressions="true" authentication-manager-ref="apiAuthenticationManager" order="1" > <http-basic/> <intercept-url pattern="/api/**" access="hasRole('ROLE_API')"/> <csrf disabled="true"/> </http> <!-- 通用http块设置更低优先级,order值为2 --> <http pattern="/**" auto-config="true" use-expressions="true" create-session="always" disable-url-rewriting="true" authentication-manager-ref="authenticationManager" order="2"> <form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" username-parameter="j_username" password-parameter="j_password" authentication-failure-url="/login?login_error=t" default-target-url="/redirectlogin"/> <logout logout-url="/resources/j_spring_security_logout"/> ... <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/> ... </http>
2. 为API的Basic认证显式配置认证入口点
额外配置BasicAuthenticationEntryPoint,确保API请求认证失败时直接返回401状态码,不会触发重定向:
首先新增Bean配置:
<bean id="basicEntryPoint" class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> <property name="realmName" value="API Realm"/> </bean>
然后修改API的<http>块中的<http-basic>配置,绑定入口点:
<http-basic entry-point-ref="basicEntryPoint" />
配置生效验证
调整后/api/**的请求会优先匹配第一个过滤链,认证失败直接返回401,不会落入第二个通用过滤链的鉴权逻辑,即可解决重定向循环问题。你之前删除第二个块的/**拦截规则后逻辑恢复,本质是因为即使API请求落入通用链也不会触发强制鉴权,属于临时规避方案,显式指定优先级才是符合Spring Security设计的标准解法。
内容的提问来源于stack exchange,提问作者David Göransson
相关产品推荐
相关产品推荐

