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

Spring Security 6.0集成Azure OAuth2+CSRF:如何在Postman中登录?

问题解答

0. 浏览器中OAuth2令牌的存储与Postman无效的原因

  • 浏览器登录Azure后,Spring Security会把**OAuth2授权客户端信息(包括访问令牌、刷新令牌)**存在服务器端的会话(HttpSession)里,同时通过Cookie给浏览器返回会话标识(比如JSESSIONID),后续浏览器请求时自动携带这个Cookie,服务器就能关联到对应的会话并取出令牌验证。
  • 你从OAuth2AuthorizedClient拿到的令牌在Postman中无效,是因为Postman没有携带浏览器的会话Cookie,服务器无法识别该令牌所属的已认证会话。而且OAuth2访问令牌本身和会话绑定,单独提取令牌直接使用不符合Spring Security OAuth2登录的会话认证模式。

1. 当前SecurityConfig的问题与优化

你的配置方向正确,但存在几个可修正/优化的点:

  • 授权规则冗余:requestMatchers( "/api/v1/**").authenticated()已经覆盖了所有请求方法的/api/v1/**路径,后续的POST、PUT规则属于重复配置,可以简化为:
    .authorizeHttpRequests(authz -> authz
            .requestMatchers("/", "/oauth2/authorization/azure-dev", "/login").permitAll()
            .requestMatchers(HttpMethod.POST, "/logout").permitAll()
            .anyRequest().authenticated()
    )
    
  • Logout配置问题:你设置了logoutRequestMatcher(new AntPathRequestMatcher("/logout")),但默认Spring Security的logout处理GET请求,而你允许POST /logout匿名访问,易造成混淆。建议明确指定logout的请求方法为POST,同时因开启了CSRF,POST请求需携带CSRF令牌,调整后的配置如下:
    .logout(l -> l
            .logoutSuccessUrl("/")
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "POST"))
    )
    
  • CSRF配置验证:CookieCsrfTokenRepository.withHttpOnlyFalse()的配置是正确的,它会将CSRF令牌存入名为XSRF-TOKEN的Cookie(HttpOnly=false允许前端读取)。另外你观察到GET请求中没有CSRF令牌是正常行为——CSRF防护针对的是会改变状态的请求(POST/PUT/DELETE等),GET请求本身不需要CSRF保护,Spring Security不会自动为其添加令牌。

2. 前端如何结合登录与CSRF令牌

不需要额外创建特殊端点,按以下流程处理即可:

  1. 登录流程:前端直接跳转至/oauth2/authorization/azure-dev,完成Azure登录后,Spring Security会自动创建会话并返回会话Cookie,同时将CSRF令牌写入XSRF-TOKEN Cookie。
  2. 获取并携带CSRF令牌:前端通过document.cookie读取XSRF-TOKEN的值,在发送POST/PUT/DELETE等请求时,将该值放入X-XSRF-TOKEN请求头中(Spring Security默认会识别这个请求头)。
  3. 会话标识自动携带:浏览器会自动携带同域的会话Cookie,前端无需额外处理,服务器通过这个Cookie识别已登录用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:37:21