我正在尝试使用Keycloak保护我的休息api和前端。
前端基于Angular 4。
Backend是使用Spring启动构建的rest api。
我在keycloak管理控制台中创建了两个客户端,位于同一领域(testRealm)。
前端客户端的ACCESS-TYPE是“公共”。
后端客户端(backendService)ACCESS-TYPE是“仅限承载”。
前端工作正常,并根据角色显示标签。
当我尝试点击/访问后端服务调用时,它在浏览器控制台中显示以下错误 -
无法加载http://localhost:9099/api/transaction
预检的响应包含无效的HTTP状态代码401。
以下是我用来保护rest api的配置。
application.properties
server.contextPath=/test
server.port=9090
keycloak.realm: testRealm
keycloak.bearer-only: true
keycloak.auth-server-url: http://localhost:8080/auth
keycloak.ssl-required: external
keycloak.resource: backendService
keycloak.use-resource-role-mappings: true
keycloak.confidential-port: 0
keycloak.credentials.secret=dc04c236-d2b9-560e-b6b2-efa2064b2386
ApiSecurityConfig.java (keycloak适配器的Spring启动安全配置)
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class ApiSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
/**
* Api request URI and their mapping roles and access are configured in this
* method.This is method from spring security web configuration Override this
* method to configure the HttpSecurity.
*
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.authorizeRequests()
.antMatchers("/api/*")
.hasRole("admin")
.anyRequest()
.permitAll();
}
}
我已经验证了application.properties文件中的keclaok属性,通过交叉检查来自Keycloak服务器的安装JSON文件,如下所示。
从Keycloak服务器获取的安装JSON文件
{
"realm": "testRealm",
"bearer-only": true,
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "backendService",
"use-resource-role-mappings": true,
"confidential-port": 0
}
我已经检查了keycloak.credentials.secret,它和我正在使用的完全相同,但它仍然不允许访问后端并提供
未经授权,状态= 401
不确定,如果我遗失了什么,我们非常感谢任何帮助。