微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在使用oauth2和Google / Azure身份验证服务器的Java应用程序中注销问题

如何解决在使用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问题:(-。

我的安全配置

enter image description here

文字

 @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页面

enter image description here

任何帮助将不胜感激!

预先感谢

解决方法

您可能需要告诉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 网址。

my application.properties

现在,您可以像这样配置OidcClientInitiatedLogoutSuccessHandler

SecurityConfig.java

这使得从我的应用程序注销时,先前的处理程序将被调用并使授权服务器中的会话无效。

非常感谢您的帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。