Java 键斗篷CORS过滤器弹簧靴

Java 键斗篷CORS过滤器弹簧靴,java,spring,rest,cors,keycloak,Java,Spring,Rest,Cors,Keycloak,我正在使用keydove来保护我的rest服务。我指的是给出的教程。我创建了其余部分和前端。现在,当我在后端添加keydape时,当我的前端进行api调用时,我得到CORS错误 spring引导中的Application.java文件如下所示 @SpringBootApplication public class Application { public static void main( String[] args ) { SpringApplication.

我正在使用keydove来保护我的rest服务。我指的是给出的教程。我创建了其余部分和前端。现在,当我在后端添加keydape时,当我的前端进行api调用时,我得到CORS错误

spring引导中的Application.java文件如下所示

@SpringBootApplication
public class Application 
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfiguration() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/*")
                        .allowedMethods(HttpMethod.GET.toString(), HttpMethod.POST.toString(),
                                HttpMethod.PUT.toString(), HttpMethod.DELETE.toString(), HttpMethod.OPTIONS.toString())
                        .allowedOrigins("*");
            }
        };
    }
} 
application.properties文件中的KeyClope属性如下所示

keycloak.realm = demo
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = tutorial-backend
keycloak.bearer-only = true
keycloak.credentials.secret = 123123-1231231-123123-1231
keycloak.cors = true
keycloak.securityConstraints[0].securityCollections[0].name = spring secured api
keycloak.securityConstraints[0].securityCollections[0].authRoles[0] = admin
keycloak.securityConstraints[0].securityCollections[0].authRoles[1] = user
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /api/*
我正在调用的示例RESTAPI

@RestController
public class SampleController {    
    @RequestMapping(value ="/api/getSample",method=RequestMethod.GET)
    public string home() {
        return new string("demo");
    }        
}
前端keydeport.json属性包括

{
  "realm": "demo",
  "auth-server-url": "http://localhost:8080/auth",
  "ssl-required": "external",
  "resource": "tutorial-frontend",
  "public-client": true
}
我得到的CORS错误

XMLHttpRequest cannot load http://localhost:8090/api/getSample. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 401.

当客户端发送身份验证标头时,您不能使用
允许的来源(“*”)。您必须配置一个特定的源URL。

尝试创建您的CORS bean,如我的示例所示。我最近经历了同样的事情(让CORS工作),这是一场噩梦,因为SpringBoot CORS支持目前没有MVC CORS那么强大和直接

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);

    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
}
这就是我设置它以接受任何源应用程序范围的方式,但是如果您更改一些参数,您应该能够复制您想要的。例如,如果您只想添加您提到的方法,请链接一些
addAllowedMethod()
。允许的来源将相同,然后您的
addMapping(“/api/*”)
将变成
source.registerCorsConfiguration(“/api/*”,config)

编辑:


看看这个。Sebastian是Spring工程团队的成员,因此这与您将获得的正式答案差不多。

我没有访问代码示例的权限,但根据您包含的代码配置,似乎缺少配置导致Spring排除CORS头

J.West的回答与我最近在Spring和CORS中遇到的问题类似,但是我要提醒您注意Spring示例引用的实现,因为有两个。和。这两种实现彼此独立工作,并且不能组合


在使用基于过滤器的方法时,关键是将allow credentials设置为true,以便浏览器跨域发送身份验证头。我还建议使用上面提出的完整代码方法,因为这将允许您通过属性注入或服务注册表创建一个可配置得多的web应用程序,以便跨多个域或环境进行部署。

访问控制允许源站
头应该由服务器应用程序根据请求中提供的
源站
请求头进行设置服务器应用程序。通常,浏览器在检测到跨源请求时,会在请求中设置
Origin
头。他们期望一个
访问控制Allow Origin
头来响应Allow

现在,对于Keyclope,我也遇到了同样的问题。看一看,在出现错误响应的情况下,keydepot似乎没有添加
accesscontrolalloworigin
头。然而,对我来说,即使是在成功响应的情况下,也没有在响应中添加此标题

查看代码并添加断点,我注意到客户机对象的webOrigin没有从
Origin
头填充,即使传递了,因此CORS没有添加访问控制响应头

我能够通过在CORS构建调用之前添加以下代码行使其正常工作:

client.addWebOrigin(headers.getRequestHeader("Origin").get(0));
之前:

Cors.add(request, Response.ok(res, MediaType.APPLICATION_JSON_TYPE)).auth().allowedOrigins(client).allowedMethods("POST").exposedHeaders(Cors.ACCESS_CONTROL_ALLOW_METHODS).build();
使用此更改构建代码并启动服务器后,我开始获得三个访问控制响应头:

Access-Control-Expose-Headers: Access-Control-Allow-Methods 
Access-Control-Allow-Origin: http://localhost:9000 
Access-Control-Allow-Credentials: true
我正在使用客户端凭据授权类型;因此,我只在
buildClientCredentialsGrant
中添加了它

我仍然需要进行更多的代码潜水,以确定这是well成功响应的一个bug,并找到更好的位置在KeyClope代码中的客户机对象上设置这一点(如正在构造客户机对象的位置)

欢迎您试一试

更新:

我收回这个。我用根URL(我前端的应用程序端口)在KeyClope中重新注册了我的客户端,并开始获得正确的访问控制响应头。希望这对您有所帮助。

我来到这里时遇到了同样的问题,并通过仅对选项进行身份验证的方法解决了它,如下所示:

keycloak.securityConstraints[0].security-collections[0].omitted-methods[0]=OPTIONS
@CrossOrigin(origins = "*")
@RestController
public class UsersApi {...}
它对我有效,因为选项请求Keycloack不包括身份验证头

更新 我的浏览器缓存有问题,所以我看不到后端代码更改的真正影响。看起来真正对我有用的是在@RestController级别启用所有CORS源,如下所示:

keycloak.securityConstraints[0].security-collections[0].omitted-methods[0]=OPTIONS
@CrossOrigin(origins = "*")
@RestController
public class UsersApi {...}

我知道。。这个问题由来已久。 但是如果您在使用SpringBoot+KeyClope进行本地开发时遇到问题,您可以使用配置

keycloak.cors=true
在您的application.properties中


干杯:)

因为您已经在application.properties文件中设置了属性
keydepot.cors=true
,所以您必须提到keydepot服务器中启用cors的来源。要执行此操作,请执行以下步骤

转到
Clients->选择客户机(令牌所有者)->设置->网站来源
逐个添加原点或添加*以允许所有原点。 完成此操作后,您必须获得一个新令牌。(如果您解码令牌,您将看到您的源代码为
允许的源代码“:[“*”]


设置属性
keydape.cors=false
是另一个选项。但这会完全禁用cors。

我知道问题太老了,但我找到了更好的解决方案。

在application.yml文件中

keycloak:
  auth-server-url: http://localhost:8180/auth
  realm: CollageERP
  resource: collage-erp-web
  public-client: true
  use-resource-role-mappings: true
  cors: true
  cors-max-age: 0
  principal-attribute: preferred_username
  cors-allowed-methods: POST, PUT, DELETE, GET
  cors-allowed-headers: X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers  

也可以使用application.properties文件进行配置

  keycloak.auth-server-url= http://localhost:8180/auth
  keycloak.realm= CollageERP
  keycloak.resource= collage-erp-web
  keycloak.public-client= true
  keycloak.use-resource-role-mappings= true
  keycloak.cors= true
  keycloak.cors-max-age= 0
  keycloak.principal-attribute= preferred_username
  keycloak.cors-allowed-methods= POST, PUT, DELETE, GET
  keycloak.cors-allowed-headers= X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers  

还有我的java adaper类

导入org.keydeport.adapters.keydeposconfigresolver;
导入org.keydove.adapters.springboot.keydovepspringbootconfigresolver;
导入org.keydepot.adapters.springsecurity.keydeposecurity配置;
导入org.keydeport.adapters.springsecurity.config.keydepowebsecurityConfigureAdapter;
进口