我想将 Keycloak 与 Spring Boot 2 和 Swagger 集成

use*_*180 4 swagger spring-boot keycloak

现在,我使用Spring boot 2.0.0.RELEASE版本和Swagger 3.1.6版本以及Jboss的Keycloak。我想知道如何在application.yml中配置然后让swagger可以从Keycloak获取access_token。

感谢您的帮助

Rya*_*son 5

最初要做的决定是,访问 swagger 页面的用户需要有访问令牌(即 swagger 的 url 模式是安全的,用户必须登录才能访问 swagger),还是从 swagger 中排除 swagger URL keycloak 以便无需令牌即可访问其 UI。

如果您使用keycloak spring boot 适配器,则要保护的 URL 模式(以及访问它们需要哪些角色)在 application.yml 或 application.properties 文件中配置为安全约束。作为属性,一个例子是:

keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*
Run Code Online (Sandbox Code Playgroud)

这可以翻译为 yaml:

keycloak:
  security-constraints[0]:
    -authRoles[0]: user
    -securityCollections[0]:
      -patterns[0]: /customers/*
Run Code Online (Sandbox Code Playgroud)

(真实的 yml 示例位于https://github.com/codemonkeybr/skip/blob/master/skip-cart/src/main/resources/application.yml#L29

安全约束之外的任何内容都不受限制。如果您不使用官方的 keycloak adpater,则可以使用 Spring Security 执行此操作类似的方法 - 通常,您可以在 SecurityConfiguration java 类中执行此操作。

然后,您将面临基于您选择的 oauth2 流程以及是否使用“尝试”功能的决策。您可以显示描述,而不必需要令牌,但“尝试一下”确实需要令牌。上面的 yaml 示例还有一种方法告诉 swagger 令牌颁发者 url:

swagger:
  auth:
    token-url: ${keycloak.auth-server-url}/realms/${keycloak.realm}/protocol/openid-connect/token/
    client-id: skip-local
Run Code Online (Sandbox Code Playgroud)

该配置由java swagger 配置类读取,并且是您可以运行的整个示例的一部分。关于如何配置 swagger 以使用 oauth2 令牌的具体问题并不特定于 keycloak,而是一般的swagger-oauth2 配置,在 baeldung 上有一个指南,并且在 Swagger 中的 Keycloak 集成中有一个使用不同模式的示例