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

标签 spring-boot swagger keycloak

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

谢谢你的帮助

最佳答案

最初要做的决定是是说访问 swagger 页面的用户需要有一个访问 token (即 swagger 的 url 模式是安全的,用户必须登录才能使用 swagger)还是从keycloak 以便无需 token 即可访问其 UI。

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

keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

这可以翻译成 yaml 为:
keycloak:
  security-constraints[0]:
    -authRoles[0]: user
    -securityCollections[0]:
      -patterns[0]: /customers/*

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

安全约束未涵盖的任何内容都不受限制。如果您不使用官方的keycloak adpater,则有一种类似的方法可以使用spring security来执行此操作-通常然后您在SecurityConfiguration java类中执行此操作。

然后您将面临基于您的 chosen oauth2 flow 的决定以及您是否使用“试用”功能。您可以在不需要 token 的情况下显示描述,但“试用”确实需要 token 。上面的 yaml 示例也有一种方法可以告诉 swagger token 发行者 url:
swagger:
  auth:
    token-url: ${keycloak.auth-server-url}/realms/${keycloak.realm}/protocol/openid-connect/token/
    client-id: skip-local

该配置由 java swagger configuration class 读取并且是 whole example 的一部分你可以跑。这个关于如何配置 swagger 以使用 oauth2 token 的特定问题并不是 keycloak 特有的,而是通用的 swagger-oauth2 configuration for which there is a guide at baeldungKeycloak integration in Swagger 中有一个使用不同模式的示例

关于spring-boot - 我想将 Keycloak 与 Spring Boot 2 和 Swagger 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964184/

相关文章:

java - @ApiResponse 响应主体为空(Spring Boot)

java - 使用接收到的访问 token 检索 Keycloak 用户数据

javascript - 为什么 Angular 无法识别用户是否使用 keycloak 登录?

java - 无法使用Keycloak验证应用程序用户的登录

go - Curl 因这个 swagger 规范而失败

java - apache Camel 天气库入门

java - 由 : org. apache.camel.NoTypeConversionAvailableException 引起:没有可用于从类型 POJO 转换为 byte[] 的类型转换器

java - Spring Boot 多个文件上传多个对象

mysql - 运行spring boot应用程序时出错

python - 使用 Swagger 的同一 def 中的 HTTP 方法的语法