[英]Keycloak Spring boot backend and Angular frontend, CORS Error
我正在尝试在 Angular 9 中构建前端应用程序,并在 spring 引导中构建后端。
使用 keycloak 对用户进行身份验证和授权。
我在 keycloak 上创建了 2 个客户端,一个具有公共访问类型的前端和一个仅承载后端。
使用本教程https://www.npmjs.com/package/keycloak-angular配置 angular 应用程序
spring 引导应用程序配置了此应用程序。属性
spring.profiles.active=development
server.port=9000
keycloak.enabled = true
keycloak.realm = test-realm
keycloak.auth-server-url = http://localhost:8080/auth/
keycloak.ssl-required = external
keycloak.resource = backend
keycloak.credentials.secret = 5353e8ee-80b5-4c2b-b543-c08247475868
keycloak.use-resource-role-mappings = true
keycloak.bearer-only = true
keycloak.cors = true
keycloak.securityConstraints[0].securityCollections[0].name = protected resource
keycloak.securityConstraints[0].authRoles[0] = user
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /products
keycloak.securityConstraints[0].securityCollections[0].patterns[1] = /products/
当我尝试从 angular 应用程序发布 /products 时,我得到
查看各种示例我尝试以这种方式修改springboot的application.properties文件
spring.profiles.active=development
server.port=9000
keycloak.enabled = true
keycloak.realm = test-realm
keycloak.auth-server-url = http://localhost:8080/auth/
keycloak.ssl-required = external
keycloak.resource = frontend
keycloak.bearer-only = true
keycloak.public-client=true
keycloak.cors = true
keycloak.securityConstraints[0].securityCollections[0].name = protected resource
keycloak.securityConstraints[0].authRoles[0] = user
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /products
keycloak.securityConstraints[0].securityCollections[0].patterns[1] = /products/
并且有效,但据我了解,最正确的方法是在前端和后端的 keycloak 上有 2 个单独的客户端。
我哪里错了,为什么我得到 CROS 错误??? 我在 Angular 应用程序上检查了此部分,但没问题 https://www.npmjs.com/package/keycloak-angular#client-configuration
我认为问题是 Angular 上的配置不正确,但我不知道是什么。
首先,您需要在配置 class 中使用这个@Bean
。 如果您使用不同的 url,请更改allowedOrigins
。 也许您需要在 controller 中添加@CrossOrigin
注释。 其次,如果您使用 Spring 安全性,则需要在配置方法中添加http.cors()
。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("https://localhost:4200");
}
};
}
}
如果您正在使用 Spring 安全配置的示例方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/api/**").permitAll()
.anyRequest().permitAll()
.and().httpBasic();
}
TL;博士
经过数小时的测试,我发现问题只是这个标志keycloak.use-resource-role-mappings = true
删除它后,一切都开始正常工作。
更多细节
我发现CORS错误实际上是一个错误的线索,添加这个class之后
@Configuration
public class FilterProvider {
@Bean
public WebMvcConfigurer corsConfiguration() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods(HttpMethod.GET.toString(), HttpMethod.POST.toString(),
HttpMethod.PUT.toString(), HttpMethod.DELETE.toString(), HttpMethod.OPTIONS.toString())
.allowedOrigins("*");
}
};
}
}
我收到了 403 未经授权的错误,所以问题不在 CORS 设置中,而是在其他地方...... the keycloak.use-resource-role-mappings = true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.