You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security 5.0.4自定义failureForwardUrl配置问题(基于Spring Boot 2.0.1)

自定义Spring Security登录失败跳转(failureForwardUrl)配置指导

嘿,针对你的Spring Security 5.0.4 + Spring Boot 2.0.1场景,我来一步步帮你搞定自定义登录失败跳转的配置:

1. 基础配置修改

首先,在你现有的formLogin()配置块中添加failureForwardUrl()方法,指定登录失败后服务器内部转发的目标地址。比如我们把失败跳转指向/login-error,修改后的完整配置如下:

http
    .csrf().disable()
    .authorizeRequests()
        .antMatchers("/", "/index.html", "/#", "/reader.html").permitAll()
        .antMatchers("/favicon.ico").permitAll()
        .antMatchers("/app/**", "/assets/**", "/translations/**", "/vendor/**").permitAll()
        .antMatchers("/login**", "/login-error").permitAll() // 务必给失败跳转地址放行
        .anyRequest().authenticated() // 其余所有请求均需认证
    .and()
    .formLogin()
        .loginPage("/login")
        .loginProcessingUrl("/perform-login") // 这里补全你的登录提交接口地址
        .failureForwardUrl("/login-error") // 核心:添加自定义失败转发配置
        .permitAll();

2. 编写对应的控制器处理转发请求

因为failureForwardUrl是服务器内部转发(不是浏览器重定向),所以你需要创建一个控制器方法来处理/login-error的POST请求(登录失败的请求是POST方式),还能顺便获取登录失败的具体原因:

import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@Controller
public class LoginController {

    // 处理登录页面的GET请求
    @GetMapping("/login")
    public String loginPage() {
        return "login";
    }

    // 处理登录失败的转发请求
    @PostMapping("/login-error")
    public ModelAndView loginError(HttpServletRequest request) {
        ModelAndView mav = new ModelAndView("login"); // 回到登录页面
        // 从请求属性中取出Spring Security存储的登录失败异常
        AuthenticationException exception = 
            (AuthenticationException) request.getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
        if (exception != null) {
            mav.addObject("errorMessage", "登录失败:" + exception.getMessage());
        }
        return mav;
    }
}

3. 关键注意点

  • 放行跳转地址:一定要在authorizeRequests()里给自定义的失败跳转地址(比如/login-error)添加permitAll(),否则会被Spring Security的认证拦截规则挡住。
  • 请求方式匹配:failureForwardUrl转发的是POST请求,所以控制器方法必须用@PostMapping;如果想要浏览器地址栏变化的重定向效果,可以用failureUrl(),但它无法直接获取异常信息,需要通过会话传递。
  • 异常信息传递:Spring Security会自动把登录失败的异常存入请求属性SPRING_SECURITY_LAST_EXCEPTION中,你可以在控制器里取出并传递到页面展示给用户。

这样配置后,当用户登录失败时,请求会被转发到/login-error,控制器处理后带着错误信息回到登录页面,完美实现自定义的失败跳转逻辑~

内容的提问来源于stack exchange,提问作者C-Shark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:39