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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:57