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

Spring Boot配置表单与自定义Token两种登录认证时Token跳转登录页问题

问题根源

你当前的配置存在两个核心问题:

  1. 优先级更高的JWT认证配置仅绑定了LOGINJWT单个路径,除该路径外的所有业务请求都不会进入JWT认证链,会直接落到Order为2的表单登录配置链中,而表单登录链没有配置Token解析逻辑,未识别到认证信息就会触发登录页重定向。
  2. JWT认证链没有关闭默认的重定向逻辑和Session管理,就算认证失败也会沿用默认的表单登录跳转逻辑,而不会返回接口预期的401状态码。

解决方案

1. 调整JWT配置的路径匹配范围

把所有需要Token认证的接口路径统一纳管到JWT配置链中,比如业务接口统一使用/api/**前缀,就将JWT配置的匹配规则修改为匹配该前缀,确保相关请求不会落到表单登录配置链。

2. 补充JWT配置的无状态、无重定向设置

JWT认证为无状态模式,不需要Session、表单登录、重定向跳转相关逻辑,修正后的JWT配置示例如下:

protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        // 匹配所有需要Token认证的接口前缀
        .mvcMatcher("/api/**")
        .csrf().disable()
        // 关闭Session创建,完全依赖Token认证
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        // 认证失败直接返回401,不触发登录页重定向
        .exceptionHandling()
            .authenticationEntryPoint((request, response, authException) -> 
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
            .and()
        .addFilterBefore(authenticationFilter(), WebAsyncManagerIntegrationFilter.class)
        .authorizeRequests()
            // 配置/api前缀下的公开接口,比如获取Token的登录接口
            .antMatchers("/api/auth/login").permitAll()
            .anyRequest().fullyAuthenticated()
            // 无状态认证不需要服务端logout逻辑,按需保留即可
            .and()
        .logout().disable();
    // @formatter:on
}

3. 确认自定义过滤器的认证信息写入逻辑

确保你的customFilter在Token校验通过后,已经将生成的Authentication对象写入安全上下文:

// 认证成功后必须执行该步骤,否则后续权限校验会判定为未登录
SecurityContextHolder.getContext().setAuthentication(validatedAuthentication);

内容的提问来源于stack exchange,提问作者Mickey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:36:00