Spring Boot Keycloak-仅限承载 - 用于后端服务无法正常工作

时间:2018-02-03 19:14:01

标签: spring-boot keycloak bearer-token oidc keycloak-services

我正在尝试使用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

不确定,如果我遗失了什么,我们非常感谢任何帮助。

0 个答案:

没有答案