钥匙帽 CORS 过滤器弹簧套

2022-09-03 02:13:38

我正在使用钥匙斗篷来保护我的休息服务。我指的是这里给出的教程。我创建了其余部分和前端。现在,当我在后端添加密钥保护时,当我的前端进行api调用时,我会收到CORS错误。

应用程序.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 文件中的键斗属性如下所示

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/*

我正在调用的示例 REST API

@RestController
public class SampleController {    
    @RequestMapping(value ="/api/getSample",method=RequestMethod.GET)
    public string home() {
        return new string("demo");
    }        
}

前端密钥斗篷.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.

答案 1

我知道。。这个问题已经很老了。但是,如果您在使用Spring Boot + Keycloak的本地开发时遇到问题,则可以使用Config

keycloak.cors=true

在应用程序.属性中。

干杯:)


答案 2

尝试创建您的 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);

编辑:

Spring Data Rest and Cors

看看这个。Sebastian是Spring工程团队的成员,所以这和你得到的官方答案一样好。