我从 https://github.com/microsoft/azure-spring-boot 下载了带有 spring boot 的 Azure AD 。只要我使用
运行azure-active-directory-spring-boot-sample
,一切都很好并且工作正常
mvn spring-boot:run
如自述文件中所示。
我正在尝试一个基本的现实场景,其中 Angular/React 应用程序 使用 npm 在单独的端口上单独运行。当我将它们分离出来时,主过滤器 AADAuthenticationFilter
仅在第一个请求上调用一次,在该请求中执行 token 验证,而对于后续请求则不再调用。
我绕了一圈并配置了一个 nginx 代理,以便这两个域现在相同
localhost:9999
并且我根据下一个路径进行重定向,例如 npm 的 web
和 Spring boot 的 app
。这使得 cookie 在每次请求时都可用。
这很有帮助,因为我了解到 Spring 使用 cookie 来维护 session 。但理想情况下,AAD 过滤器应在每个请求时重新验证 token 。
但是,如果我将 azure.activedirectory.session-stateless=true
属性添加到我的 application.properties,如过滤器代码中所述,使其成为无状态并在每个请求上进行验证。它期望角色作为 AD 中的不同属性,而不是用户的一组。
我也不明白当 js
文件嵌入到 Spring 应用程序中并运行所有这些工作时, get 的行为完全正常,并且在每个请求时都会调用过滤器。但当我把它们分开时,它就不起作用了。
任何帮助或指示将不胜感激。
最佳答案
我意识到有人可能需要更多信息来调试上述问题。但我只是能够解决这个问题 - 至少找到了导致它的问题。就像我之前提到的,当我分离客户端和 Spring API 时,问题就开始了。由于客户端无法发回服务器设置的 cookie,由于域的更改,我不得不放置代理服务器。
后来我发现每个 GET
请求总是调用 AAD 过滤器。甚至多次请求。但其他请求(例如 POST、PUT
)失败了。我尝试在 spring WebSecurityConfig.java -->> http.csrf().disable();
中禁用 csrf
配置
这解决了我的问题,现在我收到了请求,一切都按预期进行。现在我想弄清楚如何不完全禁用 csrf。
谢谢
关于java - AADAuthenticationFilter 仅调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60241506/