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

