如何解决在使用oauth2和Google / Azure身份验证服务器的Java应用程序中注销问题
我遇到了问题,需要一些建议。 情况如下,我有一个非常简单的具有弹簧安全性和受保护HTML页面的Java模块。该模块唯一要做的就是针对Google / Azure进行身份验证,如果凭据正确,它将带我进入HTML页面。实现OAuth2和Spring安全5。身份验证工作没有问题,我获得了idTokens,访问令牌和刷新令牌(对于Azure)。 尝试注销时出现问题(HTML调用“ app / logogut” URL的按钮)。我看到有关本地安全上下文的内容已删除,没有Cookie,浏览器的存储空间也没有剩余,但是,外部服务器(Google / Azure)上的会话仍然处于活动状态,当我刷新页面时,仍在登录。 如果我使用Gmail打开新标签页,则无需登录即可直接输入;如果我从Gmail注销,则现在刷新第一个标签页时,它会询问用户并再次通过。我的查询是我是否缺少某些登出帐户以通过Spring安全性完全关闭会话?
此外,尝试对每个服务器的URL进行GET登出,这似乎可行,但是那样走-CORS问题:(-。
我的安全配置
文字内
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/login**").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/app/logout"))
.addlogoutHandler(new HeaderWriterlogoutHandler(
new ClearSiteDataHeaderWriter(
ClearSiteDataHeaderWriter.Directive.CACHE,ClearSiteDataHeaderWriter.Directive.COOKIES,ClearSiteDataHeaderWriter.Directive.STORAGE)))
.and()
.oauth2Login()
.and().csrf().disable()
;
}
我的控制器
@Autowired
@PreAuthorize("hasRole('ROLE_USER')")
@GetMapping("/restricted")
public String restricted() throws IOException,URISyntaxException {
URL resource = getClass().getClassLoader().getResource("static\\Protected.html");
if (resource == null) {
throw new IllegalArgumentException("file not found!");
} else {
File html = new File(resource.toURI());
List<String> strings = Files.readLines(html,StandardCharsets.UTF_8);
StringBuffer sb = new StringBuffer();
for (String s : strings) {
sb.append(s);
}
return sb.toString();
}
}
HTML页面
任何帮助将不胜感激!
预先感谢
解决方法
您可能需要告诉Spring Security在注销时使http会话无效:
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/app/logout"))
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
或者根据您处理授权服务器的方式,重定向到处理注销的控制器,请参阅here
通常,您只需在注销控制器中调用session.invalidate()
即可结束oauth2登录。
最后,在所有这些时间之后,我找到了解决问题的方法。 在Spring文档(https://docs.spring.io/spring-security/site/docs/5.2.x/reference/html/oauth2.html#oauth2login-advanced-oidc-logout之后,我发现了一些所谓的Single Sign Out,如果在application.properties中指定了issuer-uri,则可以实现。此uri返回一个json,其中的其他数据为 end_session_endpoint 网址。
现在,您可以像这样配置OidcClientInitiatedLogoutSuccessHandler
这使得从我的应用程序注销时,先前的处理程序将被调用并使授权服务器中的会话无效。
非常感谢您的帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。