Spring Boot Security凭证正确却返回404:重定向路径无法解析
解决Spring Security认证成功后重定向到"/"导致404的问题
你的问题核心是JWT登录场景下,默认的认证成功处理逻辑触发了不必要的重定向,而你的应用中不存在"/"路径对应的接口,因此返回404。下面是具体的分析和解决方案:
问题根源
你使用的AbstractAuthenticationProcessingFilter默认继承了AbstractAuthenticationTargetUrlRequestHandler,这个处理器在认证成功后会执行重定向逻辑:
- 当未设置
targetUrlParameter,且没有保存原始请求(比如直接访问登录接口的场景),会默认重定向到"/" - 但你的登录接口是
POST /user/login/,JWT认证场景下不需要重定向,应该直接返回令牌给客户端,默认的重定向逻辑完全不适用你的场景
解决方案:重写认证成功处理逻辑
修改JWTLoginFilter,覆盖successfulAuthentication方法,跳过默认重定向,直接生成JWT并写入响应:
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter { public JWTLoginFilter(String url, AuthenticationManager authManager) { super(new AntPathRequestMatcher(url)); setAuthenticationManager(authManager); } @Override public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException, IOException, ServletException { User user = new ObjectMapper().readValue(req.getInputStream(), User.class); Optional<User> dbUser = SpringContextBridge.services().getUserRepository().findUserByEmail(user.getEmail()); dbUser.ifPresent(us -> user.setPassword(SecretGenerator.generateSha256(user.getPassword(), us.getSecret()))); return getAuthenticationManager() .authenticate(new UsernamePasswordAuthenticationToken(user.getEmail(), user.getPassword(), Collections.emptyList()) ); } // 重写认证成功逻辑,跳过默认重定向 @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { // 调用你的Token生成服务创建JWT String token = TokenAuthenticationService.generateToken(authResult.getName()); // 将令牌返回给客户端,这里示例同时设置响应头和响应体 response.addHeader("Authorization", "Bearer " + token); response.setContentType("application/json;charset=UTF-8"); new ObjectMapper().writeValue(response.getWriter(), Map.of("code", 200, "token", token, "message", "登录成功")); // 关键:不要调用父类的successfulAuthentication,避免触发重定向 } }
额外验证项
- 确认
TokenAuthenticationService的generateToken方法能正确生成包含用户信息的JWT - 检查
WebSecurityConfig中的过滤器顺序:JWTLoginFilter已正确放在UsernamePasswordAuthenticationFilter之前,当前配置没问题 - 确保
/user/login/接口仅接受POST请求,且未被其他安全规则拦截
修改后,认证成功后会直接返回JWT令牌,不再执行重定向,404问题即可解决。
内容的提问来源于stack exchange,提问作者Guchelkaben
相关产品推荐
相关产品推荐

