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
相关产品推荐
相关产品推荐

