提问者:小点点

密钥斗篷注销给cors错误


我正在构建一个Spring Cloud网关并尝试注销keyCloak,但它给了我cors错误,我的代码如下:

我在其中定义注销代码逻辑的安全类:

@Bean
public ServerSecurityContextRepository securityContextRepository() {
    WebSessionServerSecurityContextRepository securityContextRepository =
            new WebSessionServerSecurityContextRepository();

    securityContextRepository.setSpringSecurityContextAttrName("langdope-security-context");

    return securityContextRepository;
}

private LogoutWebFilter logoutWebFilter() {
    LogoutWebFilter logoutWebFilter = new LogoutWebFilter();

    SecurityContextServerLogoutHandler logoutHandler = new SecurityContextServerLogoutHandler();
    logoutHandler.setSecurityContextRepository(securityContextRepository());

    RedirectServerLogoutSuccessHandler logoutSuccessHandler = new RedirectServerLogoutSuccessHandler();
    logoutSuccessHandler.setLogoutSuccessUrl(URI.create("http://localhost:9000/app/Default"));

    logoutWebFilter.setLogoutHandler(logoutHandler());
    logoutWebFilter.setLogoutSuccessHandler(logoutSuccessHandler);
    logoutWebFilter.setRequiresLogoutMatcher(
            ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/app/logout")
    );

    return logoutWebFilter;
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http,ReactiveClientRegistrationRepository repository) {
    // Authenticate through configured OpenID Provider
    http.addFilterAfter(new CustomWebFilter(), SecurityWebFiltersOrder.LAST).authorizeExchange()
            .pathMatchers("/app/logout").permitAll()
            .pathMatchers("/app/authenticate").authenticated()
            .pathMatchers("/app/**").authenticated().and().
            logout().disable()
            .securityContextRepository(securityContextRepository())
            .addFilterAt(logoutWebFilter(), SecurityWebFiltersOrder.LOGOUT)
            .oauth2Login(Customizer.withDefaults());

    // Also logout at the OpenID Connect provider
    http.httpBasic().disable();
    // Require authentication for all requests
   // http.authorizeExchange().anyExchange().authenticated();

    // Allow showing /home within a frame
    http.headers().frameOptions().mode(XFrameOptionsServerHttpHeadersWriter.Mode.SAMEORIGIN);

    // Disable CSRF in the gateway to prevent conflicts with proxied service CSRF
    http.csrf().disable();

    return http.build();
}

现在,当我从前endpoint击注销时,它会给我以下错误:

Access to XMLHttpRequest at 'http://localhost:8280/auth/realms/Default/protocol/openid-connect/auth?response_type=code&client_id=Default&scope=openid%20email%20profile&state=qVQ46iGilTo9o2Ro7CdZzl9kmsMm23jnEqckybucgII%3D&redirect_uri=http://localhost:9000/login/oauth2/code/keycloak&nonce=Z6hMnfYEJaOpuJnX44obCe6GyW8Oc6FSn3MOU_2bRg4' (redirected from 'http://localhost:9000/app/logout') from origin 'http://localhost:9000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

在KeyCloak中有效的URL我已经给出了*进行测试,但仍然不起作用。我错过了什么?


共1个答案

匿名用户

我花了我的份额的时间弄清楚钥匙斗篷CORS错误,这就是我想出的。

如果您已正确配置Web源(https://stackoverflow.com/a/59072362/20992932),并且仍然收到CORS错误,则很可能您发送的请求不正确(jboss在检查客户端Web源之前处理错误)。

要了解您是否属于这种情况,最简单的解决方案是在浏览器上禁用同源策略(当然仅在测试期间)。然后在网络控制台中,您应该会看到实际的错误响应。

以下是如何在基于chrome的浏览器中执行此操作:

chromic-浏览器--disable-web-security--user-data-dir="[此处的一些目录]"

更多信息见:https://stackoverflow.com/a/59072362/20992932