SpringBoot + Keycloak 适配器设置失败

Posted

技术标签:

【中文标题】SpringBoot + Keycloak 适配器设置失败【英文标题】:SpringBoot + Keycloak adapter setup failed 【发布时间】:2020-02-10 12:57:03 【问题描述】:

我尝试使用 Keycloak 适配器保护 SpringBoot 后端。

SprinBoot 2.1.9 Keycloak 6.0.1

我只是在为大量错误和缺少文档而摸不着头脑。目前,我尝试让 keycloak 适配器正确响应 Cors Header 以处理 401 WWW-authenticate 错误。

调查发现org.keycloak.adapters.AuthenticatedActionsHandler类中securityContext为null,导致响应中没有设置header。

protected boolean corsRequest()  
    if (!deployment.isCors()) return false;
    KeycloakSecurityContext securityContext = facade.getSecurityContext(); // This return null
    String origin = facade.getRequest().getHeader(CorsHeaders.ORIGIN);
    String exposeHeaders = deployment.getCorsExposedHeaders();

    if (deployment.getPolicyEnforcer() != null) 
        if (exposeHeaders != null) 
            exposeHeaders += ",";
         else 
            exposeHeaders = "";
        

        exposeHeaders += "WWW-Authenticate";
    

    String requestOrigin = UriUtils.getOrigin(facade.getRequest().getURI());
    log.debugv("Origin: 0 uri: 1", origin, facade.getRequest().getURI());
    if (securityContext != null && origin != null && !origin.equals(requestOrigin)) 

按照代码,我发现:

public class OIDCCatalinaHttpFacade extends CatalinaHttpFacade implements OIDCHttpFacade

public OIDCCatalinaHttpFacade(org.apache.catalina.connector.Request request, HttpServletResponse response) 
    super(response, request);


@Override
public KeycloakSecurityContext getSecurityContext() 
    return (KeycloakSecurityContext)request.getAttribute(KeycloakSecurityContext.class.getName());



getSecurityContext 返回 null。

那么我缺少什么让它工作?

这是我的springboot application.propertie

server.port = 8081
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true
spring.main.allow-bean-definition-overriding=true
logging.level.org.springframework.security=DEBUG
logging.level.org.keycloak=TRACE

keycloak.realm = spring
keycloak.bearer-only = true
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.ssl-required = none
keycloak.resource = spring-boot-elide
keycloak.credentials.secret = *********************
keycloak.confidential-port = 0
keycloak.enabled = true
keycloak.cors = true

【问题讨论】:

【参考方案1】:

您可以将 keycloak 适配器与 keycloak spring starter 和 spring security 一起使用。并使用 WebSecurityConfigurerAdapter Config 来处理覆盖配置方法中的 CORS。

请参阅此文档:https://www.keycloak.org/docs/6.0/securing_apps/index.html#_spring_boot_adapter

【讨论】:

以上是关于SpringBoot + Keycloak 适配器设置失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 keycloak 进行 Springboot 测试

将Springboot webapp部署到Docker时Keycloak适配器无法验证令牌

使用 Keycloak 和 SpringBoot 的多租户

springboot整合keycloak

如何使 Spring Boot 适配器中的 Keycloak 策略执行器与 vaadin 一起使用

是否可以告诉 Spring Boot Keycloak 适配器 Keycloak 服务器可能有多个别名?