Java 键斗篷CORS过滤器弹簧靴
我正在使用keydove来保护我的rest服务。我指的是给出的教程。我创建了其余部分和前端。现在,当我在后端添加keydape时,当我的前端进行api调用时,我得到CORS错误 spring引导中的Application.java文件如下所示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.
@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;
进口