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

Spring Security 5 OAuth2自定义登录页OAuth2AuthenticationToken返回null问题

解决自定义OAuth2登录页中OAuth2AuthenticationToken为null的问题

嘿,我来帮你搞定这个问题!你遇到的OAuth2AuthenticationToken一直为null的情况,其实是两个小细节没处理对导致的:对认证时机的误解,加上登录页面的跳转路径错误。咱们一步步来修正:

1. 为什么OAuth2AuthenticationToken会是null?

OAuth2AuthenticationToken这个参数,只有在用户已经完成OAuth2认证流程之后的请求里,才会被Spring Security自动注入到控制器方法中。而你现在是在未认证用户访问的登录页控制器里试图获取它——这时候用户还没开始认证呢,这个token根本不存在,所以自然是null。

先把控制器里的这个多余参数去掉:

@GetMapping("/login/oauth2")
// 移除OAuth2AuthenticationToken参数,登录页访问时还没认证,这个参数不存在
public String login(Model model) {
    return "login";
}

2. 修正登录页面的跳转链接路径

你登录页面里的链接/login/oauth2/code/google是错误的!这个路径是Google认证完成后回调到你的应用的端点,不是用户发起认证的入口。

Spring Security OAuth2登录的正确授权发起端点是/oauth2/authorization/{registrationId},这里的registrationId就是你配置文件里Google客户端对应的标识(默认是google)。把登录页面的链接改成:

<h1>Logowanie</h1>
<a>ZALOGUJ</a>
<!-- 修正为正确的授权发起端点 -->
<a class="btn" href="/oauth2/authorization/google">Login with Google</a>

3. 确认HttpSecurity配置(可选优化)

你的现有配置其实没问题,但可以调整得更清晰,明确OAuth2登录的相关规则:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/").permitAll() // 首页允许所有人访问
            .anyRequest().authenticated() // 其他所有请求需要认证
            .and()
        .oauth2Login()
            .loginPage("/login/oauth2") // 指定自定义登录页
            .permitAll(); // 允许未认证用户访问登录页
}

为什么默认配置正常?

因为Spring Security的默认OAuth2登录页,使用的是正确的/oauth2/authorization/{registrationId}端点来发起认证流程,而你自己写的页面误用了回调端点,导致根本没触发授权流程,自然不会产生认证token啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:34